Пример #1
0
        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());
        }
Пример #2
0
        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);
        }