in src/ICSharpCode.SharpZipLib/Zip/ZipFormat.cs [50:159]
internal static int WriteLocalHeader(Stream stream, ZipEntry entry, out EntryPatchData patchData,
bool headerInfoAvailable, bool patchEntryHeader, long streamOffset, StringCodec stringCodec)
{
patchData = new EntryPatchData();
stream.WriteLEInt(ZipConstants.LocalHeaderSignature);
stream.WriteLEShort(entry.Version);
stream.WriteLEShort(entry.Flags);
stream.WriteLEShort((byte)entry.CompressionMethodForHeader);
stream.WriteLEInt((int)entry.DosTime);
if (headerInfoAvailable)
{
stream.WriteLEInt((int)entry.Crc);
if (entry.LocalHeaderRequiresZip64)
{
stream.WriteLEInt(-1);
stream.WriteLEInt(-1);
}
else
{
stream.WriteLEInt((int)entry.CompressedSize + entry.EncryptionOverheadSize);
stream.WriteLEInt((int)entry.Size);
}
}
else
{
if (patchEntryHeader)
patchData.CrcPatchOffset = streamOffset + stream.Position;
stream.WriteLEInt(0); // Crc
if (patchEntryHeader)
patchData.SizePatchOffset = streamOffset + stream.Position;
// For local header both sizes appear in Zip64 Extended Information
if (entry.LocalHeaderRequiresZip64 && patchEntryHeader)
{
stream.WriteLEInt(-1);
stream.WriteLEInt(-1);
}
else
{
stream.WriteLEInt(0); // Compressed size
stream.WriteLEInt(0); // Uncompressed size
}
}
byte[] name = stringCodec.ZipOutputEncoding.GetBytes(entry.Name);
if (name.Length > 0xFFFF)
{
throw new ZipException("Entry name too long.");
}
var ed = new ZipExtraData(entry.ExtraData);
if (entry.LocalHeaderRequiresZip64)
{
ed.StartNewEntry();
if (headerInfoAvailable)
{
ed.AddLeLong(entry.Size);
ed.AddLeLong(entry.CompressedSize + entry.EncryptionOverheadSize);
}
else
{
ed.AddLeLong(-1);
ed.AddLeLong(-1);
}
ed.AddNewEntry(1);
if (!ed.Find(1))
{
throw new ZipException("Internal error cant find extra data");
}
patchData.SizePatchOffset = ed.CurrentReadIndex;
}
else
{
ed.Delete(1);
}
if (entry.AESKeySize > 0)
{
AddExtraDataAES(entry, ed);
}
byte[] extra = ed.GetEntryData();
stream.WriteLEShort(name.Length);
stream.WriteLEShort(extra.Length);
if (name.Length > 0)
{
stream.Write(name, 0, name.Length);
}
if (entry.LocalHeaderRequiresZip64 && patchEntryHeader)
{
patchData.SizePatchOffset += streamOffset + stream.Position;
}
if (extra.Length > 0)
{
stream.Write(extra, 0, extra.Length);
}
return ZipConstants.LocalHeaderBaseSize + name.Length + extra.Length;
}