diff --git a/SabreTools.Helper/Data/Structs.cs b/SabreTools.Helper/Data/Structs.cs index 4f2aedc4..801e2473 100644 --- a/SabreTools.Helper/Data/Structs.cs +++ b/SabreTools.Helper/Data/Structs.cs @@ -504,9 +504,9 @@ namespace SabreTools.Helper public uint CRC; public uint CompressedSize; public uint UncompressedSize; - public string FileName; - public string ExtraField; - public string Comment; + public byte[] FileName; + public byte[] ExtraField; + public byte[] Comment; public InternalFileAttributes InternalFileAttributes; public int ExternalFileAttributes; public int RelativeOffset; diff --git a/SabreTools.Helper/Tools/FileTools.cs b/SabreTools.Helper/Tools/FileTools.cs index c3078542..28b2a1bc 100644 --- a/SabreTools.Helper/Tools/FileTools.cs +++ b/SabreTools.Helper/Tools/FileTools.cs @@ -195,10 +195,6 @@ namespace SabreTools.Helper { // First, rearrange entries by name List entries = zae.Entries; - entries.Sort((i, j) => - { - return Style.CompareNumeric(i.FileName.ToLowerInvariant(), j.FileName.ToLowerInvariant()); - }); using (BinaryWriter bw = new BinaryWriter(File.Open(output, FileMode.Create))) { @@ -212,14 +208,14 @@ namespace SabreTools.Helper bw.Write((ushort)20); bw.Write((ushort)GeneralPurposeBitFlag.DeflatingMaximumCompression); bw.Write((ushort)CompressionMethod.Deflated); - bw.Write(48128); - bw.Write(8600); + bw.Write((ushort)48128); + bw.Write((ushort)8600); bw.Write(zaes.CRC); bw.Write(zaes.CompressedSize); bw.Write(zaes.UncompressedSize); bw.Write((ushort)zaes.FileName.Length); bw.Write((ushort)0); - bw.Write(zaes.FileName.Replace("\\", "/")); + bw.Write(zaes.FileName); bw.Write(zaes.Data); if ((zaes.GeneralPurposeBitFlag & GeneralPurposeBitFlag.ZeroedCRCAndSize) != 0) { @@ -239,8 +235,8 @@ namespace SabreTools.Helper bw.Write((ushort)20); bw.Write((ushort)GeneralPurposeBitFlag.DeflatingMaximumCompression); bw.Write((ushort)CompressionMethod.Deflated); - bw.Write(48128); - bw.Write(8600); + bw.Write((ushort)48128); + bw.Write((ushort)8600); bw.Write(zaes.CRC); bw.Write(zaes.CompressedSize); bw.Write(zaes.UncompressedSize); @@ -251,7 +247,7 @@ namespace SabreTools.Helper bw.Write((short)0); bw.Write(0); bw.Write((int)offsets[index]); - bw.Write(zaes.FileName.Replace("\\", "/")); + bw.Write(zaes.FileName); bw.Write(zaes.ExtraField); bw.Write(zaes.Comment); index++; @@ -267,7 +263,7 @@ namespace SabreTools.Helper bw.Write(zae.EOCDOffset - zae.SOCDOffset); bw.Write(zae.SOCDOffset); bw.Write((short)22); - bw.Write("TORRENTZIPPED-"); + bw.Write(new char[] { 'T', 'O', 'R', 'R', 'E', 'N', 'T', 'Z', 'I', 'P', 'P', 'E', 'D', '-' }); } using (BinaryReader br = new BinaryReader(File.OpenRead(output))) @@ -282,7 +278,7 @@ namespace SabreTools.Helper using (BinaryWriter bw = new BinaryWriter(File.Open(output, FileMode.Append))) { - bw.Write(zae.CentralDirectoryCRC); + bw.Write(zae.CentralDirectoryCRC.ToString("X8").ToCharArray()); } } @@ -545,13 +541,13 @@ namespace SabreTools.Helper Console.WriteLine("Entries:"); foreach (ZipArchiveEntryStruct zaes in zas.Entries) { - Console.WriteLine("Entry Filename: " + zaes.FileName.Length + " " + zaes.FileName); - Console.WriteLine("Entry Comment: " + zaes.Comment.Length + " " + zaes.Comment); + Console.WriteLine("Entry Filename: " + zaes.FileName.Length + " " + Style.ConvertHex(BitConverter.ToString(zaes.FileName))); + Console.WriteLine("Entry Comment: " + zaes.Comment.Length + " " + Style.ConvertHex(BitConverter.ToString(zaes.Comment))); Console.WriteLine("Entry Compressed Size: " + zaes.CompressedSize); Console.WriteLine("Entry Compression Method: " + zaes.CompressionMethod); Console.WriteLine("Entry CRC: " + zaes.CRC.ToString("X8")); Console.WriteLine("Entry External File Attributes: " + zaes.ExternalFileAttributes); - Console.WriteLine("Entry Extra Field: " + zaes.ExtraField.Length + " " + zaes.ExtraField); + Console.WriteLine("Entry Extra Field: " + zaes.ExtraField.Length + " " + Style.ConvertHex(BitConverter.ToString(zaes.ExtraField))); Console.WriteLine("Entry General Purpose Flag: " + zaes.GeneralPurposeBitFlag); Console.WriteLine("Entry Internal File Attributes: " + zaes.InternalFileAttributes); Console.WriteLine("Entry Last Modification File Date: " + zaes.LastModFileDate); @@ -562,6 +558,7 @@ namespace SabreTools.Helper Console.WriteLine("Entry Version Needed: " + zaes.VersionNeeded); Console.WriteLine(); } + WriteTorrentZip(zas, inputArchive + ".new", logger); Console.ReadLine(); /* @@ -1089,9 +1086,10 @@ namespace SabreTools.Helper zaes.InternalFileAttributes = (InternalFileAttributes)br.ReadInt16(); zaes.ExternalFileAttributes = br.ReadInt32(); zaes.RelativeOffset = br.ReadInt32(); - zaes.FileName = Style.ConvertHex(BitConverter.ToString(br.ReadBytes(fileNameLength))); - zaes.ExtraField = Style.ConvertHex(BitConverter.ToString(br.ReadBytes(extraFieldLength))); - zaes.Comment = Style.ConvertHex(BitConverter.ToString(br.ReadBytes(fileCommentLength))); + zaes.FileName = br.ReadBytes(fileNameLength); + zaes.ExtraField = br.ReadBytes(extraFieldLength); + zaes.Comment = br.ReadBytes(fileCommentLength); + zaes.Data = new byte[zaes.CompressedSize]; position += 46 + fileNameLength + extraFieldLength + fileCommentLength; temp = br.ReadInt32(); zas.Entries.Add(zaes); @@ -1099,6 +1097,18 @@ namespace SabreTools.Helper } } + // Next, use the entries, if any, to get the uncompressed data + using (BinaryReader br = new BinaryReader(File.OpenRead(input))) + { + for (int i = 0; i < zas.Entries.Count; i++) + { + ZipArchiveEntryStruct zaes = zas.Entries[i]; + br.BaseStream.Seek(zaes.RelativeOffset + 30 + zaes.FileName.Length, SeekOrigin.Begin); + zaes.Data = br.ReadBytes((int)zaes.CompressedSize); + zas.Entries[i] = zaes; + } + } + // Finally, get a hash of the entire central directory (between SOCD and EOCD) if (zas.SOCDOffset > 0 && zas.EOCDOffset > 0) {