コード例 #1
0
        private static void GenCodes(int[] lengths, HuffmanTree tree)
        {
            var codes = GetCodes(lengths);

            for (var i = 0; i < lengths.Length; i++)
            {
                var length = lengths[i];
                if (length == 0)
                {
                    continue;
                }
                var code = codes[length]++;
                tree.AddCode(ToFixedBinaryString(code, length), i);
            }
        }
コード例 #2
0
        public void TestDecodeCustom()
        {
            var tree1 = new HuffmanTree();
            var tree2 = new HuffmanTreeSlow();
            var tree3 = new HuffmanTreeTree();

            for (var i = 0; i < 15; i++)
            {
                tree1.AddCode(Replicate(i, '1') + "0", 'a' + i);
                tree2.AddCode(Replicate(i, '1') + "0", 'a' + i);
                tree3.AddCode(Replicate(i, '1') + "0", 'a' + i);
            }
            var          lookupTable = tree1.GetLookupTable(255);
            const string test        = "abacabaabcdefghijklmno";
            var          encoded     = test.Aggregate("", (current, c) =>
                                                      current + Adjust(Convert.ToString(lookupTable.Item1[c], 2), lookupTable.Item2[c], '0')
                                                      );
            var decoder1 = tree1.GetDecoder();
            var decoder2 = tree2.GetDecoder();
            var decoder3 = tree3.GetDecoder();
            var result1  = "";
            var result2  = "";
            var result3  = "";

            foreach (var c in encoded)
            {
                var r1 = decoder1.Next((byte)(c == '0' ? 0 : 1));
                var r2 = decoder2.Next((byte)(c == '0' ? 0 : 1));
                var r3 = decoder3.Next((byte)(c == '0' ? 0 : 1));
                if (r1 >= 0)
                {
                    result1 += (char)r1;
                }
                if (r2 >= 0)
                {
                    result2 += (char)r2;
                }
                if (r3 >= 0)
                {
                    result3 += (char)r3;
                }
            }
            Assert.AreEqual(test, result1);
            Assert.AreEqual(test, result2);
            Assert.AreEqual(test, result3);
        }
コード例 #3
0
        public void TestEncodeCustom()
        {
            var tree1 = new HuffmanTree();

            for (var i = 0; i < 15; i++)
            {
                tree1.AddCode(Replicate(i, '1') + "0", 'a' + i);
            }
            var          lookupTable = tree1.GetLookupTable(255);
            const string test        = "abacabaabcdefghijklmno";
            var          result1     = "";
            var          result2     = "";

            foreach (var c in test)
            {
                result1 += Adjust(Convert.ToString(lookupTable.Item1[c], 2), lookupTable.Item2[c], '0');
                result2 += Replicate(c - 'a', '1') + "0";
            }
            Assert.AreEqual(result1, result2);
        }