diff --git a/IRDKit/IRDKit.csproj b/IRDKit/IRDKit.csproj index b972c8c..a7d6c71 100644 --- a/IRDKit/IRDKit.csproj +++ b/IRDKit/IRDKit.csproj @@ -10,7 +10,7 @@ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64 latest true - 0.3.0 + 0.3.1 Deterous @@ -29,8 +29,8 @@ - - + + diff --git a/IRDKit/Program.cs b/IRDKit/Program.cs index 17c9fca..fb27a09 100644 --- a/IRDKit/Program.cs +++ b/IRDKit/Program.cs @@ -487,7 +487,7 @@ namespace IRDKit printText.AppendLine($"TitleID: {IRD1.TitleID} vs {IRD2.TitleID}"); if (IRD1.Title != IRD2.Title) - printText.AppendLine($"Title: {IRD1.Title} vs {IRD2.Title}"); + printText.AppendLine($"Title: \"{IRD1.Title}\" vs \"{IRD2.Title}\""); if (IRD1.SystemVersion != IRD2.SystemVersion) printText.AppendLine($"PUP Version: {IRD1.SystemVersion} vs {IRD2.SystemVersion}"); @@ -504,8 +504,13 @@ namespace IRDKit if (header1.Length != header2.Length) printText.AppendLine($"Header Length: {header1.Length} vs {header2.Length}"); - if (!header1.SequenceEqual(header2)) - printText.AppendLine($"Header: Differs"); + int headerDiff; + if (header1.Length < header2.Length) + headerDiff = header2.Length - header1.Length + header1.Where((x, i) => x != header2[i]).Count(); + else + headerDiff = header1.Length - header2.Length + header2.Where((x, i) => x != header1[i]).Count(); + if (headerDiff != 0) + printText.AppendLine($"Header: Differs by {headerDiff} bytes"); byte[] footer1 = Decompress(IRD1.Footer); byte[] footer2 = Decompress(IRD2.Footer); @@ -513,8 +518,13 @@ namespace IRDKit if (footer1.Length != footer2.Length) printText.AppendLine($"Footer Length: {footer1.Length} vs {footer2.Length}"); - if (!footer1.SequenceEqual(footer2)) - printText.AppendLine($"Footer: Differs"); + int footerDiff; + if (footer1.Length < footer2.Length) + footerDiff = footer2.Length - footer1.Length + footer1.Where((x, i) => x != footer2[i]).Count(); + else + footerDiff = footer1.Length - footer2.Length + footer2.Where((x, i) => x != footer1[i]).Count(); + if (footerDiff != 0) + printText.AppendLine($"Footer: Differs by {footerDiff} bytes"); if (IRD1.RegionCount != IRD2.RegionCount) printText.AppendLine($"Region Count: {IRD1.RegionCount} vs {IRD2.RegionCount}"); @@ -533,21 +543,19 @@ namespace IRDKit if (IRD1.FileCount != IRD2.FileCount) printText.AppendLine($"File Count: {IRD1.FileCount} vs {IRD2.FileCount}"); - int fileCount = IRD2.FileCount < IRD1.FileCount ? (int)IRD2.FileCount : (int)IRD1.FileCount; - if (fileCount > IRD1.FileKeys.Length) - fileCount = IRD1.FileKeys.Length; - if (fileCount > IRD2.FileKeys.Length) - fileCount = IRD2.FileKeys.Length; - if (fileCount > IRD1.FileHashes.Length) - fileCount = IRD1.FileHashes.Length; - if (fileCount > IRD2.FileHashes.Length) - fileCount = IRD2.FileHashes.Length; - for (int i = 0; i < fileCount; i++) + for (int i = 0; i < IRD1.FileKeys.Length; i++) { - if (IRD1.FileKeys[i] != IRD2.FileKeys[i]) - printText.AppendLine($"File {i} Offset: {IRD1.FileKeys[i]} vs {IRD2.FileKeys[i]}"); - if (!IRD1.FileHashes[i].SequenceEqual(IRD2.FileHashes[i])) - printText.AppendLine($"File {i} Hash: {Convert.ToHexString(IRD1.FileHashes[i])} vs {Convert.ToHexString(IRD2.FileHashes[i])}"); + int j = Array.FindIndex(IRD2.FileKeys, element => element == IRD1.FileKeys[i]); + if (j == -1) + printText.AppendLine($"File Offset: {IRD1.FileKeys[i]} vs [Not Present]"); + if (j != -1 && !IRD1.FileHashes[i].SequenceEqual(IRD2.FileHashes[j])) + printText.AppendLine($"File Hash at Offset {IRD1.FileKeys[i]}: {Convert.ToHexString(IRD1.FileHashes[i])} vs {Convert.ToHexString(IRD2.FileHashes[j])}"); + } + for (int i = 0; i < IRD2.FileKeys.Length; i++) + { + int j = Array.FindIndex(IRD1.FileKeys, element => element == IRD2.FileKeys[i]); + if (j == -1) + printText.AppendLine($"File Offset: [Not Present] vs {IRD2.FileKeys[i]}"); } if (IRD1.ExtraConfig != IRD2.ExtraConfig) diff --git a/LibIRD/IRD.cs b/LibIRD/IRD.cs index 7677689..66aee26 100644 --- a/LibIRD/IRD.cs +++ b/LibIRD/IRD.cs @@ -117,7 +117,6 @@ namespace LibIRD } } private byte[] _discKey; - // TODO: Link Data1Key and Disc Key /// /// D1 key @@ -640,7 +639,7 @@ namespace LibIRD ExtraConfig |= 0x01; // Redump-style IRDs use fields from PS3_DISC.SFB - using DiscUtils.Streams.SparseStream s = reader.OpenFile("PS3_DISC.SFB", FileMode.Open, FileAccess.Read); + using SparseStream s = reader.OpenFile("PS3_DISC.SFB", FileMode.Open, FileAccess.Read); // Parse PS3_DISC.SFB file PS3_DiscSFB ps3_DiscSFB = new(s); @@ -658,7 +657,7 @@ namespace LibIRD } // Read PS3 Metadata from PARAM.SFO - using (DiscUtils.Streams.SparseStream s = reader.OpenFile("\\PS3_GAME\\PARAM.SFO", FileMode.Open, FileAccess.Read)) + using (SparseStream s = reader.OpenFile("\\PS3_GAME\\PARAM.SFO", FileMode.Open, FileAccess.Read)) { // Parse PARAM.SFO file ParamSFO paramSFO = new(s); @@ -744,7 +743,7 @@ namespace LibIRD private void GetSystemVersion(FileStream fs, CDReader reader) { // Determine PUP file offset via cluster - DiscUtils.Streams.Range[] updateClusters = reader.PathToClusters("\\PS3_UPDATE\\PS3UPDAT.PUP"); + Range[] updateClusters = reader.PathToClusters("\\PS3_UPDATE\\PS3UPDAT.PUP"); if (updateClusters == null && updateClusters.Length == 0 && updateClusters[0] == null) throw new InvalidFileSystemException("Invalid file extents for PS3UPDAT.PUP"); @@ -787,7 +786,7 @@ namespace LibIRD private void GetHeader(FileStream fs, CDReader reader) { // Determine the extent of the header via cluster (Sector 0 to first data sector) - DiscUtils.Streams.Range[] sfbClusters = reader.PathToClusters("\\PS3_DISC.SFB"); + Range[] sfbClusters = reader.PathToClusters("\\PS3_DISC.SFB"); if (sfbClusters == null && sfbClusters.Length == 0 && sfbClusters[0] == null) throw new InvalidFileSystemException("Invalid file extents for PS3_DISC.SFB"); // End of header is at beginning of first byte of dedicated cluster @@ -929,7 +928,7 @@ namespace LibIRD string filePath = fileInfo.FullName; // Determine the extents of the file via clusters - DiscUtils.Streams.Range[] fileClusters = reader.PathToClusters(filePath); + Range[] fileClusters = reader.PathToClusters(filePath); // If invalid clusters were returned, we can't hash this file if (fileClusters == null && fileClusters.Length == 0) diff --git a/LibIRD/LibIRD.csproj b/LibIRD/LibIRD.csproj index b3090a2..b525964 100644 --- a/LibIRD/LibIRD.csproj +++ b/LibIRD/LibIRD.csproj @@ -6,7 +6,7 @@ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64 latest true - 0.3.0 + 0.3.1 Deterous