Internal Fixes, etc. (#20)

* Start removing mixed usages

* Check for directories before opening

* Fix writing

* Kinda fix rebuild

* One more try

* Better internal handling

* Slighty fix a couple more things

* Update RVWorld Compress code to db7d750bba

* Fix build

Co-authored-by: Matt Nadareski <mnadareski@mparticle.com>
This commit is contained in:
Matt Nadareski
2020-04-03 13:19:21 -07:00
committed by GitHub
parent 1de4bc7b18
commit 916d2a3b51
79 changed files with 3377 additions and 2337 deletions

View File

@@ -29,7 +29,8 @@ namespace Compress.SevenZip.Structure
BCJ2,
PPMd,
BZip2,
LZMA2
LZMA2,
ZSTD
}
@@ -73,40 +74,42 @@ namespace Compress.SevenZip.Structure
throw new NotSupportedException("External flag");
}
if ((Method.Length == 1) && (Method[0] == 0))
if (Method.Length == 1 && Method[0] == 0)
{
DecoderType = DecompressType.Stored;
}
else if ((Method.Length == 1) && (Method[0] == 3))
else if (Method.Length == 1 && Method[0] == 3)
{
DecoderType = DecompressType.Delta;
}
else if ((Method.Length == 3) && (Method[0] == 3) && (Method[1] == 1) && (Method[2] == 1))
else if (Method.Length == 3 && Method[0] == 3 && Method[1] == 1 && Method[2] == 1)
{
DecoderType = DecompressType.LZMA;
}
else if ((Method.Length == 4) && (Method[0] == 3) && (Method[1] == 3) && (Method[2] == 1) &&
(Method[3] == 3))
else if (Method.Length == 4 && Method[0] == 3 && Method[1] == 3 && Method[2] == 1 && Method[3] == 3)
{
DecoderType = DecompressType.BCJ;
}
else if ((Method.Length == 4) && (Method[0] == 3) && (Method[1] == 3) && (Method[2] == 1) &&
(Method[3] == 27))
else if (Method.Length == 4 && Method[0] == 3 && Method[1] == 3 && Method[2] == 1 && Method[3] == 27)
{
DecoderType = DecompressType.BCJ2;
}
else if ((Method.Length == 3) && (Method[0] == 3) && (Method[1] == 4) && (Method[2] == 1))
else if (Method.Length == 3 && Method[0] == 3 && Method[1] == 4 && Method[2] == 1)
{
DecoderType = DecompressType.PPMd;
}
else if ((Method.Length == 3) && (Method[0] == 4) && (Method[1] == 2) && (Method[2] == 2))
else if (Method.Length == 3 && Method[0] == 4 && Method[1] == 2 && Method[2] == 2)
{
DecoderType = DecompressType.BZip2;
}
else if ((Method.Length == 1) && (Method[0] == 33))
else if (Method.Length == 1 && Method[0] == 33)
{
DecoderType = DecompressType.LZMA2;
}
else if (SevenZ.supportZstd && Method.Length == 4 && Method[0] == 4 && Method[1] == 247 && Method[2] == 17 && Method[3] == 1)
{
DecoderType = DecompressType.ZSTD;
}
InputStreamsSourceInfo = new InStreamSourceInfo[NumInStreams];
for (uint i = 0; i < NumInStreams; i++)

View File

@@ -18,9 +18,9 @@ namespace Compress.SevenZip.Structure
ulong numEmptyFiles = 0;
for (;;)
for (; ; )
{
HeaderProperty hp = (HeaderProperty) br.ReadByte();
HeaderProperty hp = (HeaderProperty)br.ReadByte();
if (hp == HeaderProperty.kEnd)
{
return;
@@ -43,7 +43,7 @@ namespace Compress.SevenZip.Structure
continue;
case HeaderProperty.kEmptyStream:
EmptyStreamFlags = Util.ReadBoolFlags(br, (ulong) Names.Length);
EmptyStreamFlags = Util.ReadBoolFlags(br, (ulong)Names.Length);
for (ulong i = 0; i < size; i++)
{
if (EmptyStreamFlags[i])
@@ -69,11 +69,11 @@ namespace Compress.SevenZip.Structure
case HeaderProperty.kCreationTime:
case HeaderProperty.kLastAccessTime:
case HeaderProperty.kLastWriteTime:
br.ReadBytes((int) bytessize);
br.ReadBytes((int)bytessize);
continue;
case HeaderProperty.kDummy:
br.ReadBytes((int) bytessize);
br.ReadBytes((int)bytessize);
continue;
default:
@@ -84,16 +84,16 @@ namespace Compress.SevenZip.Structure
public void Write(BinaryWriter bw)
{
bw.Write((byte) HeaderProperty.kFilesInfo);
bw.WriteEncodedUInt64((ulong) Names.Length);
bw.Write((byte)HeaderProperty.kFilesInfo);
bw.WriteEncodedUInt64((ulong)Names.Length);
byte[] namebyte;
using (MemoryStream nameMem = new MemoryStream())
{
using (BinaryWriter nameBw = new BinaryWriter(nameMem,Encoding.UTF8,true))
using (BinaryWriter nameBw = new BinaryWriter(nameMem, Encoding.UTF8, true))
{
nameBw.Write((byte) 0); //not external
nameBw.Write((byte)0); //not external
foreach (string name in Names)
{
nameBw.WriteName(name);
@@ -105,29 +105,29 @@ namespace Compress.SevenZip.Structure
}
}
bw.Write((byte) HeaderProperty.kName);
bw.WriteEncodedUInt64((ulong) namebyte.Length);
bw.Write((byte)HeaderProperty.kName);
bw.WriteEncodedUInt64((ulong)namebyte.Length);
bw.Write(namebyte);
if (EmptyStreamFlags != null)
{
bw.Write((byte) HeaderProperty.kEmptyStream);
bw.Write((byte)HeaderProperty.kEmptyStream);
Util.WriteBoolFlags(bw, EmptyStreamFlags);
}
if (EmptyFileFlags != null)
{
bw.Write((byte) HeaderProperty.kEmptyFile);
bw.Write((byte)HeaderProperty.kEmptyFile);
Util.WriteBoolFlags(bw, EmptyFileFlags);
}
if (Attributes != null)
{
bw.Write((byte) HeaderProperty.kWinAttributes);
bw.Write((byte)HeaderProperty.kWinAttributes);
Util.WriteUint32Def(bw, Attributes);
}
bw.Write((byte) HeaderProperty.kEnd);
bw.Write((byte)HeaderProperty.kEnd);
}
public void Report(ref StringBuilder sb)

View File

@@ -30,8 +30,8 @@ namespace Compress.SevenZip.Structure
Coders[i] = new Coder();
Coders[i].Read(br);
numInStreams += (int) Coders[i].NumInStreams;
numOutStreams += (int) Coders[i].NumOutStreams;
numInStreams += (int)Coders[i].NumInStreams;
numOutStreams += (int)Coders[i].NumOutStreams;
}
int numBindPairs = numOutStreams - 1;
@@ -127,63 +127,63 @@ namespace Compress.SevenZip.Structure
public static void ReadUnPackInfo(BinaryReader br, out Folder[] Folders)
{
Folders = null;
for (;;)
for (; ; )
{
HeaderProperty hp = (HeaderProperty) br.ReadByte();
HeaderProperty hp = (HeaderProperty)br.ReadByte();
switch (hp)
{
case HeaderProperty.kFolder:
{
ulong numFolders = br.ReadEncodedUInt64();
Folders = new Folder[numFolders];
byte external = br.ReadByte();
switch (external)
{
case 0:
{
ulong folderIndex = 0;
for (uint i = 0; i < numFolders; i++)
{
Folders[i] = new Folder();
Folders[i].ReadFolder(br);
Folders[i].PackedStreamIndexBase = folderIndex;
folderIndex += (ulong) Folders[i].PackedStreamIndices.Length;
}
ulong numFolders = br.ReadEncodedUInt64();
break;
Folders = new Folder[numFolders];
byte external = br.ReadByte();
switch (external)
{
case 0:
{
ulong folderIndex = 0;
for (uint i = 0; i < numFolders; i++)
{
Folders[i] = new Folder();
Folders[i].ReadFolder(br);
Folders[i].PackedStreamIndexBase = folderIndex;
folderIndex += (ulong)Folders[i].PackedStreamIndices.Length;
}
break;
}
case 1:
throw new NotSupportedException("External flag");
}
case 1:
throw new NotSupportedException("External flag");
continue;
}
continue;
}
case HeaderProperty.kCodersUnPackSize:
{
for (uint i = 0; i < Folders.Length; i++)
{
Folders[i].ReadUnpackedStreamSize(br);
}
for (uint i = 0; i < Folders.Length; i++)
{
Folders[i].ReadUnpackedStreamSize(br);
}
continue;
}
continue;
}
case HeaderProperty.kCRC:
{
uint?[] crcs;
Util.UnPackCRCs(br, (ulong) Folders.Length, out crcs);
for (int i = 0; i < Folders.Length; i++)
{
Folders[i].UnpackCRC = crcs[i];
}
uint?[] crcs;
Util.UnPackCRCs(br, (ulong)Folders.Length, out crcs);
for (int i = 0; i < Folders.Length; i++)
{
Folders[i].UnpackCRC = crcs[i];
}
continue;
}
continue;
}
case HeaderProperty.kEnd:
return;
@@ -196,91 +196,91 @@ namespace Compress.SevenZip.Structure
public static void ReadSubStreamsInfo(BinaryReader br, ref Folder[] Folders)
{
for (;;)
for (; ; )
{
HeaderProperty hp = (HeaderProperty) br.ReadByte();
HeaderProperty hp = (HeaderProperty)br.ReadByte();
switch (hp)
{
case HeaderProperty.kNumUnPackStream:
{
for (int f = 0; f < Folders.Length; f++)
{
int numStreams = (int) br.ReadEncodedUInt64();
Folders[f].UnpackedStreamInfo = new UnpackedStreamInfo[numStreams];
for (int i = 0; i < numStreams; i++)
for (int f = 0; f < Folders.Length; f++)
{
Folders[f].UnpackedStreamInfo[i] = new UnpackedStreamInfo();
}
}
continue;
}
case HeaderProperty.kSize:
{
for (int f = 0; f < Folders.Length; f++)
{
Folder folder = Folders[f];
if (folder.UnpackedStreamInfo.Length == 0)
{
continue;
}
ulong sum = 0;
for (int i = 0; i < folder.UnpackedStreamInfo.Length - 1; i++)
{
ulong size = br.ReadEncodedUInt64();
folder.UnpackedStreamInfo[i].UnpackedSize = size;
sum += size;
}
folder.UnpackedStreamInfo[folder.UnpackedStreamInfo.Length - 1].UnpackedSize =
folder.GetUnpackSize() - sum;
}
continue;
}
case HeaderProperty.kCRC:
{
ulong numCRC = 0;
foreach (Folder folder in Folders)
{
if (folder.UnpackedStreamInfo == null)
{
folder.UnpackedStreamInfo = new UnpackedStreamInfo[1];
folder.UnpackedStreamInfo[0] = new UnpackedStreamInfo();
folder.UnpackedStreamInfo[0].UnpackedSize = folder.GetUnpackSize();
}
if ((folder.UnpackedStreamInfo.Length != 1) || !folder.UnpackCRC.HasValue)
{
numCRC += (ulong) folder.UnpackedStreamInfo.Length;
}
}
int crcIndex = 0;
uint?[] crc;
Util.UnPackCRCs(br, numCRC, out crc);
for (uint i = 0; i < Folders.Length; i++)
{
Folder folder = Folders[i];
if ((folder.UnpackedStreamInfo.Length == 1) && folder.UnpackCRC.HasValue)
{
folder.UnpackedStreamInfo[0].Crc = folder.UnpackCRC;
}
else
{
for (uint j = 0; j < folder.UnpackedStreamInfo.Length; j++, crcIndex++)
int numStreams = (int)br.ReadEncodedUInt64();
Folders[f].UnpackedStreamInfo = new UnpackedStreamInfo[numStreams];
for (int i = 0; i < numStreams; i++)
{
folder.UnpackedStreamInfo[j].Crc = crc[crcIndex];
Folders[f].UnpackedStreamInfo[i] = new UnpackedStreamInfo();
}
}
continue;
}
continue;
}
case HeaderProperty.kSize:
{
for (int f = 0; f < Folders.Length; f++)
{
Folder folder = Folders[f];
if (folder.UnpackedStreamInfo.Length == 0)
{
continue;
}
ulong sum = 0;
for (int i = 0; i < folder.UnpackedStreamInfo.Length - 1; i++)
{
ulong size = br.ReadEncodedUInt64();
folder.UnpackedStreamInfo[i].UnpackedSize = size;
sum += size;
}
folder.UnpackedStreamInfo[folder.UnpackedStreamInfo.Length - 1].UnpackedSize =
folder.GetUnpackSize() - sum;
}
continue;
}
case HeaderProperty.kCRC:
{
ulong numCRC = 0;
foreach (Folder folder in Folders)
{
if (folder.UnpackedStreamInfo == null)
{
folder.UnpackedStreamInfo = new UnpackedStreamInfo[1];
folder.UnpackedStreamInfo[0] = new UnpackedStreamInfo();
folder.UnpackedStreamInfo[0].UnpackedSize = folder.GetUnpackSize();
}
if ((folder.UnpackedStreamInfo.Length != 1) || !folder.UnpackCRC.HasValue)
{
numCRC += (ulong)folder.UnpackedStreamInfo.Length;
}
}
int crcIndex = 0;
uint?[] crc;
Util.UnPackCRCs(br, numCRC, out crc);
for (uint i = 0; i < Folders.Length; i++)
{
Folder folder = Folders[i];
if ((folder.UnpackedStreamInfo.Length == 1) && folder.UnpackCRC.HasValue)
{
folder.UnpackedStreamInfo[0].Crc = folder.UnpackCRC;
}
else
{
for (uint j = 0; j < folder.UnpackedStreamInfo.Length; j++, crcIndex++)
{
folder.UnpackedStreamInfo[j].Crc = crc[crcIndex];
}
}
}
continue;
}
case HeaderProperty.kEnd:
return;
@@ -293,14 +293,14 @@ namespace Compress.SevenZip.Structure
private void WriteFolder(BinaryWriter bw)
{
ulong numCoders = (ulong) Coders.Length;
ulong numCoders = (ulong)Coders.Length;
bw.WriteEncodedUInt64(numCoders);
for (ulong i = 0; i < numCoders; i++)
{
Coders[i].Write(bw);
}
ulong numBindingPairs = BindPairs == null ? 0 : (ulong) BindPairs.Length;
ulong numBindingPairs = BindPairs == null ? 0 : (ulong)BindPairs.Length;
for (ulong i = 0; i < numBindingPairs; i++)
{
BindPairs[i].Write(bw);
@@ -311,7 +311,7 @@ namespace Compress.SevenZip.Structure
private void WriteUnpackedStreamSize(BinaryWriter bw)
{
ulong numUnpackedStreamSizes = (ulong) UnpackedStreamSizes.Length;
ulong numUnpackedStreamSizes = (ulong)UnpackedStreamSizes.Length;
for (ulong i = 0; i < numUnpackedStreamSizes; i++)
{
bw.WriteEncodedUInt64(UnpackedStreamSizes[i]);
@@ -320,45 +320,53 @@ namespace Compress.SevenZip.Structure
public static void WriteUnPackInfo(BinaryWriter bw, Folder[] Folders)
{
bw.Write((byte) HeaderProperty.kUnPackInfo);
bw.Write((byte)HeaderProperty.kUnPackInfo);
bw.Write((byte) HeaderProperty.kFolder);
ulong numFolders = (ulong) Folders.Length;
bw.Write((byte)HeaderProperty.kFolder);
ulong numFolders = (ulong)Folders.Length;
bw.WriteEncodedUInt64(numFolders);
bw.Write((byte) 0); //External Flag
bw.Write((byte)0); //External Flag
for (ulong i = 0; i < numFolders; i++)
{
Folders[i].WriteFolder(bw);
}
bw.Write((byte) HeaderProperty.kCodersUnPackSize);
bw.Write((byte)HeaderProperty.kCodersUnPackSize);
for (ulong i = 0; i < numFolders; i++)
{
Folders[i].WriteUnpackedStreamSize(bw);
}
if (Folders[0].UnpackCRC != null)
bool hasCRC = false;
uint?[] CRCs = new uint?[numFolders];
for (ulong i = 0; i < numFolders; i++)
{
bw.Write((byte) HeaderProperty.kCRC);
throw new NotImplementedException();
CRCs[i] = Folders[i].UnpackCRC;
hasCRC |= (CRCs[i] != null);
}
bw.Write((byte) HeaderProperty.kEnd);
if (hasCRC)
{
bw.Write((byte)HeaderProperty.kCRC);
Util.WritePackedCRCs(bw, CRCs);
}
bw.Write((byte)HeaderProperty.kEnd);
}
public static void WriteSubStreamsInfo(BinaryWriter bw, Folder[] Folders)
{
bw.Write((byte) HeaderProperty.kSubStreamsInfo);
bw.Write((byte)HeaderProperty.kSubStreamsInfo);
bw.Write((byte) HeaderProperty.kNumUnPackStream);
bw.Write((byte)HeaderProperty.kNumUnPackStream);
for (int f = 0; f < Folders.Length; f++)
{
ulong numStreams = (ulong) Folders[f].UnpackedStreamInfo.Length;
ulong numStreams = (ulong)Folders[f].UnpackedStreamInfo.Length;
bw.WriteEncodedUInt64(numStreams);
}
bw.Write((byte) HeaderProperty.kSize);
bw.Write((byte)HeaderProperty.kSize);
for (int f = 0; f < Folders.Length; f++)
{
@@ -369,8 +377,8 @@ namespace Compress.SevenZip.Structure
}
}
bw.Write((byte) HeaderProperty.kCRC);
bw.Write((byte) 1); // crc flags default to true
bw.Write((byte)HeaderProperty.kCRC);
bw.Write((byte)1); // crc flags default to true
for (int f = 0; f < Folders.Length; f++)
{
Folder folder = Folders[f];
@@ -380,7 +388,7 @@ namespace Compress.SevenZip.Structure
}
}
bw.Write((byte) HeaderProperty.kEnd);
bw.Write((byte)HeaderProperty.kEnd);
}

View File

@@ -38,7 +38,7 @@ namespace Compress.SevenZip.Structure
}
private void Write(BinaryWriter bw)
public void WriteHeader(BinaryWriter bw)
{
bw.Write((byte)HeaderProperty.kHeader);
StreamsInfo.Write(bw);
@@ -46,11 +46,6 @@ namespace Compress.SevenZip.Structure
bw.Write((byte)HeaderProperty.kEnd);
}
public void WriteHeader(BinaryWriter bw)
{
Write(bw);
}
public static ZipReturn ReadHeaderOrPackedHeader(Stream stream, long baseOffset, out Header header)
{
header = null;

View File

@@ -26,9 +26,9 @@ namespace Compress.SevenZip.Structure
ulong streamPosition = 0;
for (;;)
for (; ; )
{
HeaderProperty hp = (HeaderProperty) br.ReadByte();
HeaderProperty hp = (HeaderProperty)br.ReadByte();
switch (hp)
{
case HeaderProperty.kSize:
@@ -60,12 +60,12 @@ namespace Compress.SevenZip.Structure
public static void Write(BinaryWriter bw, ulong packPosition, PackedStreamInfo[] packedStreams)
{
ulong numPackStreams = (ulong) packedStreams.Length;
bw.Write((byte) HeaderProperty.kPackInfo);
ulong numPackStreams = (ulong)packedStreams.Length;
bw.Write((byte)HeaderProperty.kPackInfo);
bw.WriteEncodedUInt64(packPosition);
bw.WriteEncodedUInt64(numPackStreams);
bw.Write((byte) HeaderProperty.kSize);
bw.Write((byte)HeaderProperty.kSize);
ulong streamPosition = 0;
for (ulong i = 0; i < numPackStreams; i++)
{
@@ -77,14 +77,14 @@ namespace Compress.SevenZip.Structure
// Only checking the first CRC assuming all the reset will be the same
if (packedStreams[0].Crc != null)
{
bw.Write((byte) HeaderProperty.kCRC);
bw.Write((byte)HeaderProperty.kCRC);
for (ulong i = 0; i < numPackStreams; i++)
{
bw.WriteEncodedUInt64(packedStreams[i].Crc ?? 0);
}
}
bw.Write((byte) HeaderProperty.kEnd);
bw.Write((byte)HeaderProperty.kEnd);
}

View File

@@ -5,7 +5,7 @@ namespace Compress.SevenZip.Structure
{
internal class SignatureHeader
{
private static readonly byte[] Signature = {(byte) '7', (byte) 'z', 0xBC, 0xAF, 0x27, 0x1C};
private static readonly byte[] Signature = { (byte)'7', (byte)'z', 0xBC, 0xAF, 0x27, 0x1C };
private byte _major;
private byte _minor;
@@ -38,7 +38,7 @@ namespace Compress.SevenZip.Structure
long pos = br.BaseStream.Position;
byte[] mainHeader = new byte[8 + 8 + 4];
br.BaseStream.Read(mainHeader, 0, mainHeader.Length);
if (!Utils.CRC.VerifyDigest(_startHeaderCRC, mainHeader, 0, (uint) mainHeader.Length))
if (!Utils.CRC.VerifyDigest(_startHeaderCRC, mainHeader, 0, (uint)mainHeader.Length))
{
return false;
}
@@ -61,18 +61,18 @@ namespace Compress.SevenZip.Structure
//ArchiveVersion
//{
bw.Write((byte) 0); // BYTE Major
bw.Write((byte) 3); // BYTE Minor
bw.Write((byte)0); // BYTE Major
bw.Write((byte)3); // BYTE Minor
//};
_crcOffset = bw.BaseStream.Position;
bw.Write((uint) 0); //HeaderCRC
bw.Write((uint)0); //HeaderCRC
//StartHeader
//{
bw.Write((ulong) 0); //NextHeaderOffset
bw.Write((ulong) 0); //NextHeaderSize
bw.Write((uint) 0); //NextHeaderCRC
bw.Write((ulong)0); //NextHeaderOffset
bw.Write((ulong)0); //NextHeaderSize
bw.Write((uint)0); //NextHeaderCRC
//}
BaseOffset = bw.BaseStream.Position;
@@ -86,9 +86,9 @@ namespace Compress.SevenZip.Structure
byte[] sigHeaderBytes;
using (MemoryStream sigHeaderMem = new MemoryStream())
{
using (BinaryWriter sigHeaderBw = new BinaryWriter(sigHeaderMem,Encoding.UTF8,true))
using (BinaryWriter sigHeaderBw = new BinaryWriter(sigHeaderMem, Encoding.UTF8, true))
{
sigHeaderBw.Write((ulong) ((long) headerpos - BaseOffset)); //NextHeaderOffset
sigHeaderBw.Write((ulong)((long)headerpos - BaseOffset)); //NextHeaderOffset
sigHeaderBw.Write(headerLength); //NextHeaderSize
sigHeaderBw.Write(headerCRC); //NextHeaderCRC
@@ -98,7 +98,7 @@ namespace Compress.SevenZip.Structure
}
}
uint sigHeaderCRC = Utils.CRC.CalculateDigest(sigHeaderBytes, 0, (uint) sigHeaderBytes.Length);
uint sigHeaderCRC = Utils.CRC.CalculateDigest(sigHeaderBytes, 0, (uint)sigHeaderBytes.Length);
bw.BaseStream.Position = _crcOffset;
bw.Write(sigHeaderCRC); //Header CRC

View File

@@ -14,9 +14,9 @@ namespace Compress.SevenZip.Structure
public void Read(BinaryReader br)
{
for (;;)
for (; ; )
{
HeaderProperty hp = (HeaderProperty) br.ReadByte();
HeaderProperty hp = (HeaderProperty)br.ReadByte();
switch (hp)
{
case HeaderProperty.kPackInfo:
@@ -42,11 +42,18 @@ namespace Compress.SevenZip.Structure
public void Write(BinaryWriter bw)
{
bw.Write((byte) HeaderProperty.kMainStreamsInfo);
bw.Write((byte)HeaderProperty.kMainStreamsInfo);
PackedStreamInfo.Write(bw, PackPosition, PackedStreams);
Folder.WriteUnPackInfo(bw, Folders);
Folder.WriteSubStreamsInfo(bw, Folders);
bw.Write((byte) HeaderProperty.kEnd);
bw.Write((byte)HeaderProperty.kEnd);
}
public void WriteHeader(BinaryWriter bw)
{
PackedStreamInfo.Write(bw, PackPosition, PackedStreams);
Folder.WriteUnPackInfo(bw, Folders);
bw.Write((byte)HeaderProperty.kEnd);
}

View File

@@ -7,7 +7,7 @@ namespace Compress.SevenZip.Structure
{
public ulong UnpackedSize;
public uint? Crc;
public void Report(ref StringBuilder sb)
{
sb.AppendLine($" Crc = {Crc.ToHex()} , Size = {UnpackedSize}");