internal void LocalFileHeaderFake(ulong filePosition, ulong uncompressedSize, ulong compressedSize, byte[] crc32, MemoryStream ms) { using BinaryWriter bw = new(ms, Encoding.UTF8, true); RelativeOffsetOfLocalHeader = filePosition; SetStatus(LocalFileStatus.TrrntZip); UncompressedSize = uncompressedSize; _compressedSize = compressedSize; CRC = crc32; ZipExtraFieldWrite zefw = new(); SetStatus(LocalFileStatus.Zip64, zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, false, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader) ); _extraField = zefw.ExtraField; byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); bw.Write(LocalFileHeaderSignature); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(lastModFileTime); bw.Write(lastModFileDate); WriteCRC(bw, CRC); bw.Write(headerCompressedSize); bw.Write(headerUnCompressedSize); ushort fileNameLength = (ushort)bFileName.Length; bw.Write(fileNameLength); ushort extraFieldLength = (ushort)_extraField.Length; bw.Write(extraFieldLength); bw.Write(bFileName, 0, fileNameLength); bw.Write(_extraField); }
private void LocalFileHeaderWrite(Stream zipFs) { using BinaryWriter bw = new(zipFs, Encoding.UTF8, true); ZipExtraFieldWrite zefw = new(); bool zip64 = zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, false, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader); _extraField = zefw.ExtraField; SetStatus(LocalFileStatus.Zip64, zip64); byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); RelativeOffsetOfLocalHeader = (ulong)zipFs.Position; bw.Write(LocalFileHeaderSignature); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(lastModFileTime); bw.Write(lastModFileDate); // these 3 values will be set correctly after the file data has been written bw.Write(0xffffffff); // crc bw.Write(0xffffffff); // CompressedSize 32bit bw.Write(0xffffffff); // UncompressedSie 32bit ushort fileNameLength = (ushort)bFileName.Length; bw.Write(fileNameLength); ushort extraFieldLength = (ushort)_extraField.Length; bw.Write(extraFieldLength); bw.Write(bFileName, 0, fileNameLength); _extraLocation = (ulong)zipFs.Position; bw.Write(_extraField); }
internal void CentralDirectoryWrite(Stream crcStream) { using BinaryWriter bw = new(crcStream, Encoding.UTF8, true); ZipExtraFieldWrite zefw = new(); SetStatus(LocalFileStatus.Zip64, zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, true, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader) ); _extraField = zefw.ExtraField; ushort extraFieldLength = (ushort)_extraField.Length; byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort fileNameLength = (ushort)bFileName.Length; ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(CentralDirectoryHeaderSignature); bw.Write((ushort)0); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); bw.Write(lastModFileTime); bw.Write(lastModFileDate); WriteCRC(bw, CRC); bw.Write(headerCompressedSize); bw.Write(headerUnCompressedSize); bw.Write(fileNameLength); bw.Write(extraFieldLength); bw.Write((ushort)0); // file comment length bw.Write((ushort)0); // disk number start bw.Write((ushort)0); // internal file attributes bw.Write((uint)0); // external file attributes bw.Write(headerRelativeOffsetOfLocalHeader); bw.Write(bFileName, 0, fileNameLength); bw.Write(_extraField, 0, extraFieldLength); // No File Comment }