From 225aaab4f4cd62b94277aed73c5fed507afb6c1a Mon Sep 17 00:00:00 2001 From: Twan van Dongen Date: Sat, 27 Jan 2024 18:28:46 +0100 Subject: [PATCH 1/2] Support for decompressing Zip Shrink (method:1) added --- src/SharpCompress/Common/CompressionType.cs | 3 +- .../Common/Zip/ZipCompressionMethod.cs | 1 + src/SharpCompress/Common/Zip/ZipEntry.cs | 4 + src/SharpCompress/Common/Zip/ZipFilePart.cs | 6 + .../Compressors/Shrink/BitStream.cs | 86 ++++ .../Compressors/Shrink/HwUnshrink.cs | 394 ++++++++++++++++++ .../Compressors/Shrink/ShrinkStream.cs | 67 +++ .../SharpCompress.Test/Zip/ZipArchiveTests.cs | 8 + tests/TestArchives/Archives/Zip.shrink.zip | Bin 0 -> 71199 bytes 9 files changed, 568 insertions(+), 1 deletion(-) create mode 100644 src/SharpCompress/Compressors/Shrink/BitStream.cs create mode 100644 src/SharpCompress/Compressors/Shrink/HwUnshrink.cs create mode 100644 src/SharpCompress/Compressors/Shrink/ShrinkStream.cs create mode 100644 tests/TestArchives/Archives/Zip.shrink.zip diff --git a/src/SharpCompress/Common/CompressionType.cs b/src/SharpCompress/Common/CompressionType.cs index 11263245..b26e5a95 100644 --- a/src/SharpCompress/Common/CompressionType.cs +++ b/src/SharpCompress/Common/CompressionType.cs @@ -14,5 +14,6 @@ public enum CompressionType LZip, Xz, Unknown, - Deflate64 + Deflate64, + Shrink } diff --git a/src/SharpCompress/Common/Zip/ZipCompressionMethod.cs b/src/SharpCompress/Common/Zip/ZipCompressionMethod.cs index 13c2dbe7..a98ed667 100644 --- a/src/SharpCompress/Common/Zip/ZipCompressionMethod.cs +++ b/src/SharpCompress/Common/Zip/ZipCompressionMethod.cs @@ -3,6 +3,7 @@ namespace SharpCompress.Common.Zip; internal enum ZipCompressionMethod { None = 0, + Shrink = 1, Deflate = 8, Deflate64 = 9, BZip2 = 12, diff --git a/src/SharpCompress/Common/Zip/ZipEntry.cs b/src/SharpCompress/Common/Zip/ZipEntry.cs index 2c544b94..61e1b6af 100644 --- a/src/SharpCompress/Common/Zip/ZipEntry.cs +++ b/src/SharpCompress/Common/Zip/ZipEntry.cs @@ -52,6 +52,10 @@ public class ZipEntry : Entry { return CompressionType.None; } + case ZipCompressionMethod.Shrink: + { + return CompressionType.Shrink; + } default: { return CompressionType.Unknown; diff --git a/src/SharpCompress/Common/Zip/ZipFilePart.cs b/src/SharpCompress/Common/Zip/ZipFilePart.cs index faefdf15..0463c97f 100644 --- a/src/SharpCompress/Common/Zip/ZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/ZipFilePart.cs @@ -9,6 +9,7 @@ using SharpCompress.Compressors.Deflate; using SharpCompress.Compressors.Deflate64; using SharpCompress.Compressors.LZMA; using SharpCompress.Compressors.PPMd; +using SharpCompress.Compressors.Shrink; using SharpCompress.Compressors.Xz; using SharpCompress.IO; using ZstdSharp; @@ -79,6 +80,10 @@ internal abstract class ZipFilePart : FilePart return new DataDescriptorStream(stream); } + case ZipCompressionMethod.Shrink: + { + return new ShrinkStream(stream, CompressionMode.Decompress, Header.CompressedSize, Header.UncompressedSize); + } case ZipCompressionMethod.Deflate: { return new DeflateStream(stream, CompressionMode.Decompress); @@ -192,6 +197,7 @@ internal abstract class ZipFilePart : FilePart switch (Header.CompressionMethod) { case ZipCompressionMethod.None: + case ZipCompressionMethod.Shrink: case ZipCompressionMethod.Deflate: case ZipCompressionMethod.Deflate64: case ZipCompressionMethod.BZip2: diff --git a/src/SharpCompress/Compressors/Shrink/BitStream.cs b/src/SharpCompress/Compressors/Shrink/BitStream.cs new file mode 100644 index 00000000..76b59041 --- /dev/null +++ b/src/SharpCompress/Compressors/Shrink/BitStream.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace SharpCompress.Compressors.Shrink +{ + internal class BitStream + { + private byte[] _src; + private int _srcLen; + private int _byteIdx; + private int _bitIdx; + private int _bitsLeft; + private ulong _bitBuffer; + private static uint[] _maskBits = new uint[17] + { + 0U, + 1U, + 3U, + 7U, + 15U, + 31U, + 63U, + (uint) sbyte.MaxValue, + (uint) byte.MaxValue, + 511U, + 1023U, + 2047U, + 4095U, + 8191U, + 16383U, + (uint) short.MaxValue, + (uint) ushort.MaxValue + }; + + public BitStream(byte[] src, int srcLen) + { + _src = src; + _srcLen = srcLen; + _byteIdx = 0; + _bitIdx = 0; + } + + public int BytesRead => (_byteIdx << 3) + _bitIdx; + + private int NextByte() + { + if (_byteIdx >= _srcLen) + { + return 0; + } + + return _src[_byteIdx++]; + } + + public int NextBits(int nbits) + { + int result = 0; + if (nbits > _bitsLeft) + { + int num; + while (_bitsLeft <= 24 && (num = NextByte()) != 1234) + { + _bitBuffer |= (ulong)num << _bitsLeft; + _bitsLeft += 8; + } + } + result = (int)((long)_bitBuffer & (long)_maskBits[nbits]); + _bitBuffer >>= nbits; + _bitsLeft -= nbits; + return result; + } + + public bool Advance(int count) + { + if (_byteIdx > _srcLen) + { + return false; + } + return true; + } + } +} diff --git a/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs b/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs new file mode 100644 index 00000000..ca3dcbe6 --- /dev/null +++ b/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs @@ -0,0 +1,394 @@ +using System; + +namespace SharpCompress.Compressors.Shrink +{ + public class HwUnshrink + { + private const int MIN_CODE_SIZE = 9; + private const int MAX_CODE_SIZE = 13; + + private const ushort MAX_CODE = (ushort)((1U << MAX_CODE_SIZE) - 1); + private const ushort INVALID_CODE = ushort.MaxValue; + private const ushort CONTROL_CODE = 256; + private const ushort INC_CODE_SIZE = 1; + private const ushort PARTIAL_CLEAR = 2; + + private const int HASH_BITS = MAX_CODE_SIZE + 1; // For a load factor of 0.5. + private const int HASHTAB_SIZE = 1 << HASH_BITS; + private const ushort UNKNOWN_LEN = ushort.MaxValue; + + private struct CodeTabEntry + { + public int prefixCode; // INVALID_CODE means the entry is invalid. + public byte extByte; + public ushort len; + public int lastDstPos; + } + + private static void CodeTabInit(CodeTabEntry[] codeTab) + { + for (int i = 0; i <= byte.MaxValue; i++) + { + codeTab[i].prefixCode = (ushort)i; + codeTab[i].extByte = (byte)i; + codeTab[i].len = 1; + } + + for (int i = byte.MaxValue + 1; i <= MAX_CODE; i++) + { + codeTab[i].prefixCode = INVALID_CODE; + } + } + + private static void UnshrinkPartialClear(CodeTabEntry[] codeTab, ref CodeQueue queue) + { + bool[] isPrefix = new bool[MAX_CODE + 1]; + int codeQueueSize; + + // Scan for codes that have been used as a prefix. + for (int i = CONTROL_CODE + 1; i <= MAX_CODE; i++) + { + if (codeTab[i].prefixCode != INVALID_CODE) + { + isPrefix[codeTab[i].prefixCode] = true; + } + } + + // Clear "non-prefix" codes in the table; populate the code queue. + codeQueueSize = 0; + for (int i = CONTROL_CODE + 1; i <= MAX_CODE; i++) + { + if (!isPrefix[i]) + { + codeTab[i].prefixCode = INVALID_CODE; + queue.codes[codeQueueSize++] = (ushort)i; + } + } + + queue.codes[codeQueueSize] = INVALID_CODE; // End-of-queue marker. + queue.nextIdx = 0; + } + + private static bool ReadCode(BitStream stream, ref int codeSize, CodeTabEntry[] codeTab, ref CodeQueue queue, out int nextCode) + { + int code, controlCode; + + code = (int)stream.NextBits(codeSize); + if (!stream.Advance(codeSize)) + { + nextCode = INVALID_CODE; + return false; + } + + // Handle regular codes (the common case). + if (code != CONTROL_CODE) + { + nextCode = code; + return true; + } + + // Handle control codes. + controlCode = (ushort)stream.NextBits(codeSize); + if (!stream.Advance(codeSize)) + { + nextCode = INVALID_CODE; + return true; + } + + if (controlCode == INC_CODE_SIZE && codeSize < MAX_CODE_SIZE) + { + codeSize++; + return ReadCode(stream, ref codeSize, codeTab, ref queue, out nextCode); + } + + if (controlCode == PARTIAL_CLEAR) + { + UnshrinkPartialClear(codeTab, ref queue); + return ReadCode(stream, ref codeSize, codeTab, ref queue, out nextCode); + } + + nextCode = INVALID_CODE; + return true; + } + + private static void CopyFromPrevPos(byte[] dst, int prevPos, int dstPos, int len) + { + if (dstPos + len > dst.Length) + { + // Not enough room in dst for the sloppy copy below. + Array.Copy(dst, prevPos, dst, dstPos, len); + return; + } + + if (prevPos + len > dstPos) + { + // Benign one-byte overlap possible in the KwKwK case. + //assert(prevPos + len == dstPos + 1); + //assert(dst[prevPos] == dst[prevPos + len - 1]); + } + + Buffer.BlockCopy(dst, prevPos, dst, dstPos, len); + } + + private static UnshrnkStatus OutputCode(int code, byte[] dst, int dstPos, int dstCap, int prevCode, + CodeTabEntry[] codeTab, ref CodeQueue queue, out byte firstByte, out int len) + { + int prefixCode; + + //assert(code <= MAX_CODE && code != CONTROL_CODE); + //assert(dstPos < dstCap); + firstByte = 0; + if (code <= byte.MaxValue) + { + // Output literal byte. + firstByte = (byte)code; + len = 1; + dst[dstPos] = (byte)code; + return UnshrnkStatus.Ok; + } + + if (codeTab[code].prefixCode == INVALID_CODE || codeTab[code].prefixCode == code) + { + // Reject invalid codes. Self-referential codes may exist in the table but cannot be used. + firstByte = 0; + len = 0; + return UnshrnkStatus.Error; + } + + if (codeTab[code].len != UNKNOWN_LEN) + { + // Output string with known length (the common case). + if (dstCap - dstPos < codeTab[code].len) + { + firstByte = 0; + len = 0; + return UnshrnkStatus.Full; + } + + CopyFromPrevPos(dst, codeTab[code].lastDstPos, dstPos, codeTab[code].len); + firstByte = dst[dstPos]; + len = codeTab[code].len; + return UnshrnkStatus.Ok; + } + + // Output a string of unknown length. + //assert(codeTab[code].len == UNKNOWN_LEN); + prefixCode = codeTab[code].prefixCode; + // assert(prefixCode > CONTROL_CODE); + + if (prefixCode == queue.codes[queue.nextIdx]) + { + // The prefix code hasn't been added yet, but we were just about to: the KwKwK case. + //assert(codeTab[prevCode].prefixCode != INVALID_CODE); + codeTab[prefixCode].prefixCode = prevCode; + codeTab[prefixCode].extByte = firstByte; + codeTab[prefixCode].len = (ushort)(codeTab[prevCode].len + 1); + codeTab[prefixCode].lastDstPos = codeTab[prevCode].lastDstPos; + dst[dstPos] = firstByte; + } + else if (codeTab[prefixCode].prefixCode == INVALID_CODE) + { + // The prefix code is still invalid. + firstByte = 0; + len = 0; + return UnshrnkStatus.Error; + } + + // Output the prefix string, then the extension byte. + len = codeTab[prefixCode].len + 1; + if (dstCap - dstPos < len) + { + firstByte = 0; + len = 0; + return UnshrnkStatus.Full; + } + + CopyFromPrevPos(dst, codeTab[prefixCode].lastDstPos, dstPos, codeTab[prefixCode].len); + dst[dstPos + len - 1] = codeTab[code].extByte; + firstByte = dst[dstPos]; + + // Update the code table now that the string has a length and pos. + //assert(prevCode != code); + codeTab[code].len = (ushort)len; + codeTab[code].lastDstPos = dstPos; + + return UnshrnkStatus.Ok; + } + + public static UnshrnkStatus Unshrink(byte[] src, int srcLen, out int srcUsed, byte[] dst, int dstCap, out int dstUsed) + { + CodeTabEntry[] codeTab = new CodeTabEntry[HASHTAB_SIZE]; + CodeQueue queue = new CodeQueue(); + var stream = new BitStream(src, srcLen); + int codeSize, dstPos, len; + int currCode, prevCode, newCode; + byte firstByte; + + CodeTabInit(codeTab); + CodeQueueInit(ref queue); + codeSize = MIN_CODE_SIZE; + dstPos = 0; + + // Handle the first code separately since there is no previous code. + if (!ReadCode(stream, ref codeSize, codeTab, ref queue, out currCode)) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Ok; + } + + //assert(currCode != CONTROL_CODE); + if (currCode > byte.MaxValue) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Error; // The first code must be a literal. + } + + if (dstPos == dstCap) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Full; + } + + firstByte = (byte)currCode; + dst[dstPos] = (byte)currCode; + codeTab[currCode].lastDstPos = dstPos; + dstPos++; + + prevCode = currCode; + while (ReadCode(stream, ref codeSize, codeTab, ref queue, out currCode)) + { + if (currCode == INVALID_CODE) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Error; + } + + if (dstPos == dstCap) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Full; + } + + // Handle KwKwK: next code used before being added. + if (currCode == queue.codes[queue.nextIdx]) + { + if (codeTab[prevCode].prefixCode == INVALID_CODE) + { + // The previous code is no longer valid. + srcUsed = stream.BytesRead; + dstUsed = 0; + return UnshrnkStatus.Error; + } + + // Extend the previous code with its first byte. + //assert(currCode != prevCode); + codeTab[currCode].prefixCode = prevCode; + codeTab[currCode].extByte = firstByte; + codeTab[currCode].len = (ushort)(codeTab[prevCode].len + 1); + codeTab[currCode].lastDstPos = codeTab[prevCode].lastDstPos; + //assert(dstPos < dstCap); + dst[dstPos] = firstByte; + } + + // Output the string represented by the current code. + UnshrnkStatus status = OutputCode(currCode, dst, dstPos, dstCap, prevCode, codeTab, ref queue, out firstByte, out len); + if (status != UnshrnkStatus.Ok) + { + srcUsed = stream.BytesRead; + dstUsed = 0; + return status; + } + + // Verify that the output matches walking the prefixes. + var c = currCode; + for (int i = 0; i < len; i++) + { + // assert(codeTab[c].len == len - i); + //assert(codeTab[c].extByte == dst[dstPos + len - i - 1]); + c = codeTab[c].prefixCode; + } + + // Add a new code to the string table if there's room. + // The string is the previous code's string extended with the first byte of the current code's string. + newCode = CodeQueueRemoveNext(ref queue); + if (newCode != INVALID_CODE) + { + //assert(codeTab[prevCode].lastDstPos < dstPos); + codeTab[newCode].prefixCode = prevCode; + codeTab[newCode].extByte = firstByte; + codeTab[newCode].len = (ushort)(codeTab[prevCode].len + 1); + codeTab[newCode].lastDstPos = codeTab[prevCode].lastDstPos; + + if (codeTab[prevCode].prefixCode == INVALID_CODE) + { + // prevCode was invalidated in a partial clearing. Until that code is re-used, the + // string represented by newCode is indeterminate. + codeTab[newCode].len = UNKNOWN_LEN; + } + // If prevCode was invalidated in a partial clearing, it's possible that newCode == prevCode, + // in which case it will never be used or cleared. + } + + codeTab[currCode].lastDstPos = dstPos; + dstPos += len; + + prevCode = currCode; + } + + srcUsed = stream.BytesRead; + dstUsed = dstPos; + + return UnshrnkStatus.Ok; + } + + public enum UnshrnkStatus + { + Ok, + Full, + Error + } + + private struct CodeQueue + { + public int nextIdx; + public ushort[] codes; + } + + private static void CodeQueueInit(ref CodeQueue q) + { + int codeQueueSize; + ushort code; + + codeQueueSize = 0; + q.codes = new ushort[MAX_CODE - CONTROL_CODE + 2]; + + for (code = CONTROL_CODE + 1; code <= MAX_CODE; code++) + { + q.codes[codeQueueSize++] = code; + } + + //assert(codeQueueSize < q.codes.Length); + q.codes[codeQueueSize] = INVALID_CODE; // End-of-queue marker. + q.nextIdx = 0; + } + private static ushort CodeQueueNext(ref CodeQueue q) + { + //assert(q.nextIdx < q.codes.Length); + return q.codes[q.nextIdx]; + } + private static ushort CodeQueueRemoveNext(ref CodeQueue q) + { + ushort code = CodeQueueNext(ref q); + if (code != INVALID_CODE) + { + q.nextIdx++; + } + return code; + } + } +} diff --git a/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs b/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs new file mode 100644 index 00000000..7926d093 --- /dev/null +++ b/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SharpCompress.Compressors.Shrink; + +internal class ShrinkStream : Stream +{ + private Stream inStream; + private CompressionMode _compressionMode; + + private ulong _compressedSize; + private long _uncompressedSize; + private byte[] _byteOut; + private long _outBytesCount; + + public ShrinkStream(Stream stream, CompressionMode compressionMode, long compressedSize, long uncompressedSize) + { + inStream = stream; + _compressionMode = compressionMode; + + _compressedSize = (ulong)compressedSize; + _uncompressedSize = uncompressedSize; + _byteOut = new byte[_uncompressedSize]; + _outBytesCount = 0L; + } + + public override bool CanRead => true; + + public override bool CanSeek => true; + + public override bool CanWrite => false; + + public override long Length => _uncompressedSize; + + public override long Position { get => _outBytesCount; set => throw new NotImplementedException(); } + + public override void Flush() => throw new NotImplementedException(); + public override int Read(byte[] buffer, int offset, int count) + { + if (inStream.Position == (long)_compressedSize) + { + return 0; + } + byte[] src = new byte[_compressedSize]; + inStream.Read(src, offset, (int)_compressedSize); + int srcUsed = 0; + int dstUsed = 0; + + HwUnshrink.Unshrink(src, (int)_compressedSize, out srcUsed, _byteOut, (int)_uncompressedSize, out dstUsed); + _outBytesCount = _byteOut.Length; + + for (int index = 0; index < _outBytesCount; ++index) + { + buffer[offset + index] = _byteOut[index]; + } + var tmp = _outBytesCount; + _outBytesCount = 0; + return (int)tmp; + } + public override long Seek(long offset, SeekOrigin origin) => throw new NotImplementedException(); + public override void SetLength(long value) => throw new NotImplementedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException(); +} diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index fde87dc6..ebcb4243 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -16,6 +16,14 @@ public class ZipArchiveTests : ArchiveTests { public ZipArchiveTests() => UseExtensionInsteadOfNameToVerify = true; + [Fact] + public void Zip_Shrink_ArchiveStreamRead() + { + UseExtensionInsteadOfNameToVerify = true; + UseCaseInsensitiveToVerify = true; + ArchiveStreamRead("Zip.shrink.zip"); + } + [Fact] public void Zip_ZipX_ArchiveStreamRead() => ArchiveStreamRead("Zip.zipx"); diff --git a/tests/TestArchives/Archives/Zip.shrink.zip b/tests/TestArchives/Archives/Zip.shrink.zip new file mode 100644 index 0000000000000000000000000000000000000000..697c7e0047de844f03018b358fdc988dbd33cd4d GIT binary patch literal 71199 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 literal 0 HcmV?d00001 From c057ffb153bedace076b102efc6586d60ba26bf2 Mon Sep 17 00:00:00 2001 From: Twan van Dongen Date: Sat, 27 Jan 2024 18:59:56 +0100 Subject: [PATCH 2/2] Refrormatted using CSharpier --- src/SharpCompress/Common/Zip/ZipFilePart.cs | 7 ++- .../Compressors/Shrink/BitStream.cs | 37 ++++++------ .../Compressors/Shrink/HwUnshrink.cs | 59 +++++++++++++++---- .../Compressors/Shrink/ShrinkStream.cs | 32 ++++++++-- 4 files changed, 100 insertions(+), 35 deletions(-) diff --git a/src/SharpCompress/Common/Zip/ZipFilePart.cs b/src/SharpCompress/Common/Zip/ZipFilePart.cs index 0463c97f..f8a0e8a8 100644 --- a/src/SharpCompress/Common/Zip/ZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/ZipFilePart.cs @@ -82,7 +82,12 @@ internal abstract class ZipFilePart : FilePart } case ZipCompressionMethod.Shrink: { - return new ShrinkStream(stream, CompressionMode.Decompress, Header.CompressedSize, Header.UncompressedSize); + return new ShrinkStream( + stream, + CompressionMode.Decompress, + Header.CompressedSize, + Header.UncompressedSize + ); } case ZipCompressionMethod.Deflate: { diff --git a/src/SharpCompress/Compressors/Shrink/BitStream.cs b/src/SharpCompress/Compressors/Shrink/BitStream.cs index 76b59041..ef01e2af 100644 --- a/src/SharpCompress/Compressors/Shrink/BitStream.cs +++ b/src/SharpCompress/Compressors/Shrink/BitStream.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; - namespace SharpCompress.Compressors.Shrink { internal class BitStream @@ -14,26 +13,26 @@ namespace SharpCompress.Compressors.Shrink private int _byteIdx; private int _bitIdx; private int _bitsLeft; - private ulong _bitBuffer; + private ulong _bitBuffer; private static uint[] _maskBits = new uint[17] { - 0U, - 1U, - 3U, - 7U, - 15U, - 31U, - 63U, - (uint) sbyte.MaxValue, - (uint) byte.MaxValue, - 511U, - 1023U, - 2047U, - 4095U, - 8191U, - 16383U, - (uint) short.MaxValue, - (uint) ushort.MaxValue + 0U, + 1U, + 3U, + 7U, + 15U, + 31U, + 63U, + (uint)sbyte.MaxValue, + (uint)byte.MaxValue, + 511U, + 1023U, + 2047U, + 4095U, + 8191U, + 16383U, + (uint)short.MaxValue, + (uint)ushort.MaxValue }; public BitStream(byte[] src, int srcLen) diff --git a/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs b/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs index ca3dcbe6..04f38c2b 100644 --- a/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs +++ b/src/SharpCompress/Compressors/Shrink/HwUnshrink.cs @@ -69,9 +69,16 @@ namespace SharpCompress.Compressors.Shrink queue.nextIdx = 0; } - private static bool ReadCode(BitStream stream, ref int codeSize, CodeTabEntry[] codeTab, ref CodeQueue queue, out int nextCode) + private static bool ReadCode( + BitStream stream, + ref int codeSize, + CodeTabEntry[] codeTab, + ref CodeQueue queue, + out int nextCode + ) { - int code, controlCode; + int code, + controlCode; code = (int)stream.NextBits(codeSize); if (!stream.Advance(codeSize)) @@ -130,8 +137,17 @@ namespace SharpCompress.Compressors.Shrink Buffer.BlockCopy(dst, prevPos, dst, dstPos, len); } - private static UnshrnkStatus OutputCode(int code, byte[] dst, int dstPos, int dstCap, int prevCode, - CodeTabEntry[] codeTab, ref CodeQueue queue, out byte firstByte, out int len) + private static UnshrnkStatus OutputCode( + int code, + byte[] dst, + int dstPos, + int dstCap, + int prevCode, + CodeTabEntry[] codeTab, + ref CodeQueue queue, + out byte firstByte, + out int len + ) { int prefixCode; @@ -174,7 +190,7 @@ namespace SharpCompress.Compressors.Shrink // Output a string of unknown length. //assert(codeTab[code].len == UNKNOWN_LEN); prefixCode = codeTab[code].prefixCode; - // assert(prefixCode > CONTROL_CODE); + // assert(prefixCode > CONTROL_CODE); if (prefixCode == queue.codes[queue.nextIdx]) { @@ -215,13 +231,24 @@ namespace SharpCompress.Compressors.Shrink return UnshrnkStatus.Ok; } - public static UnshrnkStatus Unshrink(byte[] src, int srcLen, out int srcUsed, byte[] dst, int dstCap, out int dstUsed) + public static UnshrnkStatus Unshrink( + byte[] src, + int srcLen, + out int srcUsed, + byte[] dst, + int dstCap, + out int dstUsed + ) { CodeTabEntry[] codeTab = new CodeTabEntry[HASHTAB_SIZE]; CodeQueue queue = new CodeQueue(); var stream = new BitStream(src, srcLen); - int codeSize, dstPos, len; - int currCode, prevCode, newCode; + int codeSize, + dstPos, + len; + int currCode, + prevCode, + newCode; byte firstByte; CodeTabInit(codeTab); @@ -296,7 +323,17 @@ namespace SharpCompress.Compressors.Shrink } // Output the string represented by the current code. - UnshrnkStatus status = OutputCode(currCode, dst, dstPos, dstCap, prevCode, codeTab, ref queue, out firstByte, out len); + UnshrnkStatus status = OutputCode( + currCode, + dst, + dstPos, + dstCap, + prevCode, + codeTab, + ref queue, + out firstByte, + out len + ); if (status != UnshrnkStatus.Ok) { srcUsed = stream.BytesRead; @@ -308,7 +345,7 @@ namespace SharpCompress.Compressors.Shrink var c = currCode; for (int i = 0; i < len; i++) { - // assert(codeTab[c].len == len - i); + // assert(codeTab[c].len == len - i); //assert(codeTab[c].extByte == dst[dstPos + len - i - 1]); c = codeTab[c].prefixCode; } @@ -376,11 +413,13 @@ namespace SharpCompress.Compressors.Shrink q.codes[codeQueueSize] = INVALID_CODE; // End-of-queue marker. q.nextIdx = 0; } + private static ushort CodeQueueNext(ref CodeQueue q) { //assert(q.nextIdx < q.codes.Length); return q.codes[q.nextIdx]; } + private static ushort CodeQueueRemoveNext(ref CodeQueue q) { ushort code = CodeQueueNext(ref q); diff --git a/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs b/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs index 7926d093..52bba1ad 100644 --- a/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs +++ b/src/SharpCompress/Compressors/Shrink/ShrinkStream.cs @@ -17,7 +17,12 @@ internal class ShrinkStream : Stream private byte[] _byteOut; private long _outBytesCount; - public ShrinkStream(Stream stream, CompressionMode compressionMode, long compressedSize, long uncompressedSize) + public ShrinkStream( + Stream stream, + CompressionMode compressionMode, + long compressedSize, + long uncompressedSize + ) { inStream = stream; _compressionMode = compressionMode; @@ -36,9 +41,14 @@ internal class ShrinkStream : Stream public override long Length => _uncompressedSize; - public override long Position { get => _outBytesCount; set => throw new NotImplementedException(); } + public override long Position + { + get => _outBytesCount; + set => throw new NotImplementedException(); + } public override void Flush() => throw new NotImplementedException(); + public override int Read(byte[] buffer, int offset, int count) { if (inStream.Position == (long)_compressedSize) @@ -50,7 +60,14 @@ internal class ShrinkStream : Stream int srcUsed = 0; int dstUsed = 0; - HwUnshrink.Unshrink(src, (int)_compressedSize, out srcUsed, _byteOut, (int)_uncompressedSize, out dstUsed); + HwUnshrink.Unshrink( + src, + (int)_compressedSize, + out srcUsed, + _byteOut, + (int)_uncompressedSize, + out dstUsed + ); _outBytesCount = _byteOut.Length; for (int index = 0; index < _outBytesCount; ++index) @@ -61,7 +78,12 @@ internal class ShrinkStream : Stream _outBytesCount = 0; return (int)tmp; } - public override long Seek(long offset, SeekOrigin origin) => throw new NotImplementedException(); + + public override long Seek(long offset, SeekOrigin origin) => + throw new NotImplementedException(); + public override void SetLength(long value) => throw new NotImplementedException(); - public override void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException(); + + public override void Write(byte[] buffer, int offset, int count) => + throw new NotImplementedException(); }