public override byte[] Decompress(byte[] buf) { var ret = new BitList(); var bits = new BitList(buf); var tableID = BitList.From(bits.Subbit(0, 16)).ToUInt16(); // [TA] var nextBitIndex = 16; Debug.Assert(tableID == TableID); var table = Table; //=== READ HUFFMAN CODE === var len = (int)BitList.GetNumberFromVariableBits(bits.Subbit(nextBitIndex), out var nobits); // [DA] Data Bytes nextBitIndex += nobits; var outdat = new List <byte>(); for (var i = 0; i < len; i++) { var hb = new BitList(); for (var j = 0; j < 32768; j++) { hb.Add(bits[nextBitIndex++]); if (table.TryGetValue(hb, out var value)) { outdat.Add(value); // [DB] break; } } } return(outdat.ToArray()); }
public static Dictionary <BitList, byte> ReadTableBinary(BitList bits, out int nextBitIndex) { // === READ TABLE === var table = new Dictionary <BitList, byte>(); var tableCount = BitList.From(bits.Subbit(0, 16)).SetMinimumSize(16).ToUInt16(); // [TA] Debug.Assert(tableCount < 32768); nextBitIndex = 16; for (var i = 0; i < tableCount; i++) { var value = BitList.From(bits.Subbit(nextBitIndex, 8)).ToByte(); // [TB] nextBitIndex += 8; var bitLen = (int)BitList.GetNumberFromVariableBits(bits.Subbit(nextBitIndex), out var numbits); nextBitIndex += numbits; table[BitList.From(bits.Subbit(nextBitIndex, bitLen))] = value; // [TE] nextBitIndex += bitLen; } if (nextBitIndex % 8 != 0) { nextBitIndex += 8 - nextBitIndex % 8; // [TF] } return(table); }