Пример #1
0
            private void Insert(HuffmanCode <T> code)
            {
                Node currentNode = root;

                for (int bitIndex = code.Length - 1; bitIndex >= 0; bitIndex--)
                {
                    int bit = BitHelpers.ExtractBits(code.Code, 1, bitIndex);

                    if (bit == 1)
                    {
                        if (currentNode.Node1 == null)
                        {
                            currentNode.Node1 = new Node();
                        }
                        currentNode = currentNode.Node1;
                    }
                    else
                    {
                        if (currentNode.Node0 == null)
                        {
                            currentNode.Node0 = new Node();
                        }
                        currentNode = currentNode.Node0;
                    }
                }
                currentNode.Value = code.Value;
            }
Пример #2
0
        public void Unpack()
        {
            Input.Position = 0x20;
            HuffmanCode[] hcodes = new HuffmanCode[512];
            HuffmanNode[] hnodes = new HuffmanNode[1023];

            int leaf_node_count = 0;

            for (ushort i = 0; i < 512; i++)
            {
                int src = Input.ReadByte();
                if (-1 == src)
                {
                    throw new EndOfStreamException("Incomplete compressed stream");
                }
                byte depth = (byte)(src - UpdateKey());
                if (0 != depth)
                {
                    hcodes[leaf_node_count].Depth = depth;
                    hcodes[leaf_node_count].Code  = i;
                    leaf_node_count++;
                }
            }
            Array.Sort(hcodes, 0, leaf_node_count);
            CreateHuffmanTree(hnodes, hcodes, leaf_node_count);
            HuffmanDecompress(hnodes, m_dec_count);
        }
Пример #3
0
 static void ReplicateValue(HuffmanCode[] table, int offset, int step, int end, HuffmanCode code)
 {
     do
     {
         end -= step;
         table[offset + end] = code;
     }while (end > 0);
 }
Пример #4
0
 /* Stores code in table[0], table[step], table[2*step], ..., table[end] */
 /* Assumes that end is an integer multiple of step */
 private static unsafe void ReplicateValue(HuffmanCode *table,
                                           int step, int end,
                                           HuffmanCode code)
 {
     do
     {
         end       -= step;
         table[end] = code;
     } while (end > 0);
 }
Пример #5
0
        static void Main()
        {
            byte[] bytes = new byte[]
            {
                255, 0, 20, 20, 13, 14, 18, 255, 0, 0, 0, 0, 1, 2, 1, 255, 255, 255, 255, 255, 255
            };
            HuffmanCode <byte> hCode = new HuffmanCode <byte>(bytes);

            Application.Run(new Form1());
        }
Пример #6
0
        public void EncondeAndDecode_WithTextTest()
        {
            string text        = "aabbbc";
            var    huffmanTree = new HuffmanCode(text);

            string encode = huffmanTree.Encode(text);
            string decode = huffmanTree.Decode(encode);

            Assert.AreEqual("111100010", encode);
            Assert.AreEqual(text, decode);
        }
Пример #7
0
        public void Write(byte[] cBytes, byte[] mBytes, byte[] yBytes, FileStream fStream)
        {
            byte[] fullBytes = new byte[cBytes.Length + mBytes.Length + yBytes.Length];
            System.Buffer.BlockCopy(cBytes, 0, fullBytes, 0, cBytes.Length);
            System.Buffer.BlockCopy(mBytes, 0, fullBytes, cBytes.Length, mBytes.Length);
            System.Buffer.BlockCopy(yBytes, 0, fullBytes, cBytes.Length + mBytes.Length, yBytes.Length);
            HuffmanCode <byte>        fHComp = new HuffmanCode <byte>(fullBytes);
            Dictionary <byte, HFCode> table  = fHComp.GetWritingTable();

            //Writing Dictionary Length
            byte[] dictionaryHeader = new byte[2];
            dictionaryHeader = BitConverter.GetBytes((short)table.Count);
            fStream.Write(dictionaryHeader, 0, 2);
            //Writing Value and Length foreach Dictionary entry
            byte[] dictionaryBitLength = new byte[2];
            foreach (KeyValuePair <byte, HFCode> pair in table)
            {
                fStream.WriteByte(pair.Key);
                dictionaryBitLength = BitConverter.GetBytes((ushort)pair.Value.length);
                fStream.Write(dictionaryBitLength, 0, 2);
            }
            //Writing Code for each Dictionary entry
            BitStream bitStream = new BitStream(fStream);

            foreach (KeyValuePair <byte, HFCode> pair in table)
            {
                bitStream.WriteBits(pair.Value.GetBitCode());
            }
            //Write Data
            long     dataLength = 0;
            BitArray buffer;

            for (int i = 0; i < cBytes.Length; ++i)
            {
                buffer      = table[cBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            for (int i = 0; i < mBytes.Length; ++i)
            {
                buffer      = table[mBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            for (int i = 0; i < yBytes.Length; ++i)
            {
                buffer      = table[yBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            Console.WriteLine($"Written bits: {dataLength}: bytes: {(dataLength / 8) + 1} : avgBytes: {((double)dataLength / (double)fullBytes.Length)}");
            bitStream.Flush();
            fStream.Close();
        }
Пример #8
0
        public void Coursework_Huffman_Test()
        {
            string text        = "often this information is the individual identification";
            var    a           = text.Length;
            var    huffmanTree = new HuffmanCode(text);

            var    b      = huffmanTree.CodeTable.OrderBy(x => x.Value.Length).ToList();
            string encode = huffmanTree.Encode(text);
            string decode = huffmanTree.Decode(encode);

            Assert.AreEqual(text, decode);
        }
Пример #9
0
        public static HTreeGroup[] New(int num_htree_groups, int table_size)
        {
            var tables       = new HuffmanCode[num_htree_groups * table_size];
            var htree_groups = new HTreeGroup[num_htree_groups];

            for (int i = 0; i < num_htree_groups; ++i)
            {
                htree_groups[i]        = new HTreeGroup();
                htree_groups[i].tables = tables;
            }
            return(htree_groups);
        }
    public static void Main()
    {
        string input = Console.ReadLine();

        Console.WriteLine(input);
        var encoder = new HuffmanCode();
        var res     = encoder.Encode(input);

        Console.WriteLine("" + res.Tree.Count + " " + res.Encoded.Length);
        res.Tree
        .Select(p => string.Format("{0}: {1}", "" + p.Key, p.Value))
        .ForEach(Console.WriteLine);
        Console.WriteLine(res.Encoded);
    }
Пример #11
0
        private void HUF_CreateCodeWorks()
        {
            byte[] scode = new byte[100];
            uint   i;

            for (i = 0; i < num_leafs; i++)
            {
                HuffmanNode node   = tree[i];
                uint        symbol = node.symbol;

                uint nbits = 0;
                while (node.dad != null)
                {
                    scode[nbits++] = node.dad.lson == node ? (byte)HUF_LNODE : (byte)HUF_RNODE;
                    node           = node.dad;
                }
                uint maxbytes = (nbits + 7) >> 3;

                HuffmanCode code = new HuffmanCode();

                codes[symbol] = code;
                code.nbits    = nbits;
                code.codework = new byte[maxbytes];

                uint j;
                for (j = 0; j < maxbytes; j++)
                {
                    code.codework[j] = 0;
                }

                byte mask = (byte)HUF_MASK;
                j = 0;
                uint nbit;
                for (nbit = nbits; nbit != 0; nbit--)
                {
                    if (scode[nbit - 1] != 0)
                    {
                        code.codework[j] |= mask;
                    }
                    if ((mask >>= HUF_SHIFT) == 0)
                    {
                        mask = (byte)HUF_MASK;
                        j++;
                    }
                }
            }
        }
Пример #12
0
        public void EncondeAndDecode_WithGivenFrequenciesTest()
        {
            string message      = "aabbbc";
            var    alphabetFreq = new Dictionary <char, int>()
            {
                ['a'] = 2,
                ['b'] = 3,
                ['c'] = 1
            };

            var huffmanTree = new HuffmanCode(alphabetFreq);

            string encode = huffmanTree.Encode(message);
            string decode = huffmanTree.Decode(encode);

            Assert.AreEqual("111100010", encode);
            Assert.AreEqual(message, decode);
        }
Пример #13
0
        static void HuffmanTest()
        {
            Console.WriteLine("Huffman encoding test");
            HuffmanCode hc = new HuffmanCode();

            hc.Frequencies["omri"]   = 35;
            hc.Frequencies["had"]    = 3;
            hc.Frequencies["a"]      = 107;
            hc.Frequencies["little"] = 53;
            hc.Frequencies["lamb"]   = 27;

            hc.ComputeCodes();

            foreach (var key in hc.Codes.Keys)
            {
                Console.WriteLine(String.Format("{0}: {1}", key, hc.Codes[key]));
            }
        }
Пример #14
0
        static void HuffmanTestCLR()
        {
            Console.WriteLine("Huffman encoding test with CLR input");
            HuffmanCode hc = new HuffmanCode();

            hc.Frequencies["f"] = 5;
            hc.Frequencies["e"] = 9;
            hc.Frequencies["c"] = 12;
            hc.Frequencies["b"] = 13;
            hc.Frequencies["d"] = 16;
            hc.Frequencies["a"] = 45;

            hc.ComputeCodes();

            foreach (var key in hc.Codes.Keys)
            {
                Console.WriteLine(String.Format("{0}: {1}", key, hc.Codes[key]));
            }
        }
Пример #15
0
        public void Write(byte[] cBytes, byte[] mBytes, byte[] yBytes, FileStream fStream)
        {
            HuffmanCode <byte>        cFHComp = new HuffmanCode <byte>(cBytes);
            Dictionary <byte, HFCode> cTable  = cFHComp.GetWritingTable();
            HuffmanCode <byte>        mFHComp = new HuffmanCode <byte>(mBytes);
            Dictionary <byte, HFCode> mTable  = mFHComp.GetWritingTable();
            HuffmanCode <byte>        yFHComp = new HuffmanCode <byte>(yBytes);
            Dictionary <byte, HFCode> yTable  = yFHComp.GetWritingTable();

            //Writing C Dictionary Length
            byte[] dictionaryHeader = new byte[2];
            dictionaryHeader = BitConverter.GetBytes((short)cTable.Count);
            fStream.Write(dictionaryHeader, 0, 2);
            //Writing Value and Length foreach Dictionary entry
            byte[] dictionaryBitLength = new byte[2];
            foreach (KeyValuePair <byte, HFCode> pair in cTable)
            {
                fStream.WriteByte(pair.Key);
                dictionaryBitLength = BitConverter.GetBytes((ushort)pair.Value.length);
                fStream.Write(dictionaryBitLength, 0, 2);
            }
            //Writing M Dictionary Length
            dictionaryHeader = BitConverter.GetBytes((short)mTable.Count);
            fStream.Write(dictionaryHeader, 0, 2);
            //Writing Value and Length foreach Dictionary entry
            foreach (KeyValuePair <byte, HFCode> pair in mTable)
            {
                fStream.WriteByte(pair.Key);
                dictionaryBitLength = BitConverter.GetBytes((ushort)pair.Value.length);
                fStream.Write(dictionaryBitLength, 0, 2);
            }
            //Writing Y Dictionary Length
            dictionaryHeader = BitConverter.GetBytes((short)yTable.Count);
            fStream.Write(dictionaryHeader, 0, 2);
            //Writing Value and Length foreach Dictionary entry
            foreach (KeyValuePair <byte, HFCode> pair in yTable)
            {
                fStream.WriteByte(pair.Key);
                dictionaryBitLength = BitConverter.GetBytes((ushort)pair.Value.length);
                fStream.Write(dictionaryBitLength, 0, 2);
            }

            //Writing Code for each Dictionary entry
            BitStream bitStream = new BitStream(fStream);

            foreach (KeyValuePair <byte, HFCode> pair in cTable)
            {
                bitStream.WriteBits(pair.Value.GetBitCode());
            }
            foreach (KeyValuePair <byte, HFCode> pair in mTable)
            {
                bitStream.WriteBits(pair.Value.GetBitCode());
            }
            foreach (KeyValuePair <byte, HFCode> pair in yTable)
            {
                bitStream.WriteBits(pair.Value.GetBitCode());
            }
            //Write Data
            long     dataLength = 0;
            BitArray buffer;

            for (int i = 0; i < cBytes.Length; ++i)
            {
                buffer      = cTable[cBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            for (int i = 0; i < mBytes.Length; ++i)
            {
                buffer      = mTable[mBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            for (int i = 0; i < yBytes.Length; ++i)
            {
                buffer      = yTable[yBytes[i]].GetBitCode();
                dataLength += buffer.Length;
                bitStream.WriteBits(buffer);
            }
            Console.WriteLine($"Written bits: {dataLength}: bytes: {(dataLength / 8) + 1} : avgBits: {((double)dataLength / (cBytes.Length + mBytes.Length + yBytes.Length))}");
            bitStream.Flush();
            fStream.Close();
        }
Пример #16
0
 public void SetCode(int meta, int index, HuffmanCode code)
 {
     tables[htrees[meta] + index] = code;
 }
Пример #17
0
 //------------------------------------------------------------------------------
 // Decodes the next Huffman code from bit-stream.
 // FillBitWindow(br) needs to be called at minimum every second call
 // to ReadSymbol, in order to pre-fetch enough bits.
 int ReadSymbol(HuffmanCode[] table, int index)
 {
     int val = (int)br_.PrefetchBits();
     index += val & Huffman.TableMask;
     int nbits = table[index].bits - Huffman.TableBits;
     if (nbits > 0)
     {
         br_.SkipBits (Huffman.TableBits);
         val = (int)br_.PrefetchBits();
         index += table[index].value;
         index += val & ((1 << nbits) - 1);
     }
     br_.SkipBits (table[index].bits);
     return table[index].value;
 }
Пример #18
0
 int AccumulateHCode(HuffmanCode hcode, int shift, ref HuffmanCode32 huff)
 {
     huff.bits += hcode.bits;
     huff.value |= (uint)hcode.value << shift;
     return hcode.bits;
 }
Пример #19
0
        int ReadHuffmanCode(int alphabet_size, int[] code_lengths, HuffmanCode[] table, int index)
        {
            bool ok = false;
            int size = 0;
            bool simple_code = br_.ReadBits (1) != 0;

            for (int i = 0; i < alphabet_size; ++i)
                code_lengths[i] = 0;

            if (simple_code)    // Read symbols, codes & code lengths directly.
            {
                int num_symbols = (int)br_.ReadBits (1) + 1;
                int first_symbol_len_code = (int)br_.ReadBits (1);
                // The first code is either 1 bit or 8 bit code.
                int symbol = (int)br_.ReadBits ((first_symbol_len_code == 0) ? 1 : 8);
                code_lengths[symbol] = 1;
                // The second code (if present), is always 8 bit long.
                if (2 == num_symbols)
                {
                    symbol = (int)br_.ReadBits (8);
                    code_lengths[symbol] = 1;
                }
                ok = true;
            }
            else    // Decode Huffman-coded code lengths.
            {
                var code_length_code_lengths = new int[NumCodeLengthCodes];
                int num_codes = (int)br_.ReadBits (4) + 4;
                if (num_codes > NumCodeLengthCodes)
                {
                    status_ = VP8StatusCode.BitstreamError;
                    return 0;
                }
                for (int i = 0; i < num_codes; ++i)
                {
                    code_length_code_lengths[kCodeLengthCodeOrder[i]] = (int)br_.ReadBits (3);
                }
                ok = ReadHuffmanCodeLengths (code_length_code_lengths, alphabet_size, code_lengths);
            }

            ok = ok && !br_.EoS;
            if (ok)
                size = Huffman.BuildTable (table, index, Huffman.TableBits, code_lengths, alphabet_size);
            if (!ok || size == 0)
            {
                status_ = VP8StatusCode.BitstreamError;
                return 0;
            }
            return size;
        }
Пример #20
0
        bool ReadHuffmanCodeLengths(int[] code_length_code_lengths, int num_symbols, int[] code_lengths)
        {
            int prev_code_len = Huffman.DefaultCodeLength;
            var table = new HuffmanCode[1 << Huffman.LengthsTableBits];

            if (0 == Huffman.BuildTable (table, 0, Huffman.LengthsTableBits, code_length_code_lengths, NumCodeLengthCodes))
            {
                status_ = VP8StatusCode.BitstreamError;
                return false;
            }

            int max_symbol;
            if (0 != br_.ReadBits (1))      // use length
            {
                int length_nbits = 2 + 2 * (int)br_.ReadBits (3);
                max_symbol = 2 + (int)br_.ReadBits (length_nbits);
                if (max_symbol > num_symbols)
                {
                    status_ = VP8StatusCode.BitstreamError;
                    return false;
                }
            }
            else
            {
                max_symbol = num_symbols;
            }

            int symbol = 0;
            while (symbol < num_symbols)
            {
                if (max_symbol-- == 0) break;
                br_.FillBitWindow();
                int p = (int)br_.PrefetchBits() & Huffman.LengthsTableMask;
                br_.SkipBits (table[p].bits);
                int code_len = table[p].value;
                if (code_len < kCodeLengthLiterals)
                {
                    code_lengths[symbol++] = code_len;
                    if (code_len != 0) prev_code_len = code_len;
                }
                else
                {
                    bool use_prev = (code_len == kCodeLengthRepeatCode);
                    int slot = code_len - kCodeLengthLiterals;
                    int extra_bits = kCodeLengthExtraBits[slot];
                    int repeat_offset = kCodeLengthRepeatOffsets[slot];
                    int repeat = (int)br_.ReadBits(extra_bits) + repeat_offset;
                    if (symbol + repeat > num_symbols)
                    {
                        status_ = VP8StatusCode.BitstreamError;
                        return false;
                    }
                    else
                    {
                        int length = use_prev ? prev_code_len : 0;
                        while (repeat-- > 0)
                            code_lengths[symbol++] = length;
                    }
                }
            }
            return true;
        }
Пример #21
0
        public byte[] Compress(byte[] data)
        {
            uint pk4_pos = 0;

            num_bits = 8;
            uint raw_len = (uint)data.Length;

            byte[] pbuf = new byte[HUF_MAXIM + 1];
            Array.Copy(BitConverter.GetBytes((CMD_CODE) | (raw_len << 8)), pbuf, 4);
            uint pak_pos = 4;
            uint raw_pos = 0;

            HUF_InitFreqs();
            HUF_CreateFreqs(data, data.Length);

            HUF_InitTree();
            HUF_CreateTree();

            HUF_InitCodeTree();
            HUF_CreateCodeTree();

            HUF_InitCodeWorks();
            HUF_CreateCodeWorks();

            uint cod_pos = 0;

            uint len = (uint)((codetree[cod_pos] + 1) << 1);

            while (len-- != 0)
            {
                pbuf[pak_pos++] = codetree[cod_pos++];
            }
            uint mask4 = 0;

            while (raw_pos < data.Length)
            {
                uint ch = data[raw_pos++];


                int nbits;
                for (nbits = 8; nbits != 0; nbits -= num_bits)
                {
                    HuffmanCode code = codes[ch & ((1 << num_bits) - 1)];
                    ////  code = codes[ch >> (8 - num_bits)];

                    len = code.nbits;
                    int cwork = 0;

                    byte mask = (byte)HUF_MASK;
                    while (len-- != 0)
                    {
                        if ((mask4 >>= HUF_SHIFT) == 0)
                        {
                            mask4   = HUF_MASK4;
                            pk4_pos = pak_pos;
                            Array.Copy(BitConverter.GetBytes(0), 0, pbuf, pk4_pos, 4);
                            pak_pos += 4;
                        }
                        if ((code.codework[cwork] & mask) != 0)
                        {
                            Array.Copy(BitConverter.GetBytes(BitConverter.ToUInt32(pbuf, (int)pk4_pos) | mask4), 0, pbuf, pk4_pos, 4);
                        }
                        if ((mask >>= HUF_SHIFT) == 0)
                        {
                            mask = (byte)HUF_MASK;
                            cwork++;
                        }
                    }

                    ch >>= num_bits;
                    ////  ch = (ch << num_bits) & 0xFF;
                }
            }
            uint pak_len = pak_pos;

            return(pbuf.Take((int)pak_len).ToArray());
        }