コード例 #1
0
        public static HuffmanTable <T> BuildTableFromTree(HuffmanTree <T> tree)
        {
            var table = new HuffmanTable <T>();

            table.Step(tree.Root, new List <HuffmanPath.Path>());
            return(table);
        }
コード例 #2
0
        private static void RunCompression(string inputFile, string outputFile, string outputTableFile)
        {
            var bytes     = File.ReadAllBytes(inputFile);
            var bytesFreq = new Dictionary <byte, ulong>();

            foreach (var b in bytes)
            {
                if (!bytesFreq.ContainsKey(b))
                {
                    bytesFreq.Add(b, 0);
                }

                bytesFreq[b] = bytesFreq[b] + 1;
            }

            var flattenDict = bytesFreq.Select(dictEntry => new HuffmanEntry <byte>()
            {
                Value     = dictEntry.Key,
                Frequency = dictEntry.Value
            }).ToList();

            flattenDict.Sort((a, b) => a.Value - b.Value);

            var tree = HuffmanTree <byte> .BuildTree(flattenDict);

            var table = HuffmanTable <byte> .BuildTableFromTree(tree);

            var flattenTable = table.Table.Select(entry =>
            {
                return(new Tuple <byte, List <HuffmanPath.Path> >(entry.Key, entry.Value));
            }
                                                  ).ToList();

            flattenTable.Sort((a, b) => a.Item1 - b.Item1);

            var huffmanBinaryTable = new Dictionary <byte, HuffmanTableEntry>();

            foreach (var entry in flattenTable)
            {
                var huffmanEntry = HuffmanPathToValueAndNbBits(entry.Item2);
                var encodedValue = huffmanEntry.EncodedValue;
                var nbBitsEntry  = huffmanEntry.NbBits;

                huffmanBinaryTable.Add(entry.Item1, huffmanEntry);
            }

            WriteCompressedFiles(outputFile, outputTableFile, bytes, huffmanBinaryTable);
        }