コード例 #1
0
        public static byte[] Decode(byte[] encodedData, Dictionary <BitsWithLength, byte> decodeTable, long bitsCount)
        {
            var result = new List <byte>();

            var sample = new BitsWithLength {
                Bits = 0, BitsCount = 0
            };

            for (var byteNum = 0; byteNum < encodedData.Length; byteNum++)
            {
                var b = encodedData[byteNum];
                for (var bitNum = 0; bitNum < 8 && byteNum * 8 + bitNum < bitsCount; bitNum++)
                {
                    sample.Bits = (sample.Bits << 1) + ((b & (1 << (7 - bitNum))) != 0 ? 1 : 0);
                    sample.BitsCount++;

                    byte decodedByte;
                    if (!decodeTable.TryGetValue(sample, out decodedByte))
                    {
                        continue;
                    }
                    result.Add(decodedByte);
                    sample.BitsCount = 0;
                    sample.Bits      = 0;
                }
            }

            return(result.ToArray());
        }
コード例 #2
0
        public static byte[] Encode(IEnumerable <byte> data, out Dictionary <BitsWithLength, byte> decodeTable,
                                    out long bitsCount)
        {
            var dArr       = data.ToArray();
            var frequences = CalcFrequences(dArr);

            var root = BuildHuffmanTree(frequences);

            var encodeTable = new BitsWithLength[byte.MaxValue + 1];

            FillEncodeTable(root, encodeTable);

            var bitsBuffer = new BitsBuffer();

            foreach (var b in dArr)
            {
                bitsBuffer.Add(encodeTable[b]);
            }

            decodeTable = CreateDecodeTable(encodeTable);

            return(bitsBuffer.ToArray(out bitsCount));
        }