public static HuffmanTable <T> BuildTableFromTree(HuffmanTree <T> tree) { var table = new HuffmanTable <T>(); table.Step(tree.Root, new List <HuffmanPath.Path>()); return(table); }
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); }