#pragma warning disable CA1822 // Mark members as static public string Decompress(BitArray compressedTarget, HuffmanCodeNode huffmanEncodingTree) #pragma warning restore CA1822 // Mark members as static { var currentBitPointer = 0; var currentNode = huffmanEncodingTree; var resultBuilder = new StringBuilder(compressedTarget?.Length ?? 0); while (currentBitPointer <= compressedTarget?.Length) { if (currentNode?.Character.HasValue == true) { resultBuilder.Append(currentNode.Character.Value); currentNode = huffmanEncodingTree; } if (currentBitPointer == compressedTarget.Length) { break; } var currentBit = compressedTarget[currentBitPointer]; currentBitPointer++; currentNode = currentBit == false ? currentNode?.Left : currentNode?.Right; } return(resultBuilder.ToString()); }
private static HuffmanCodeNode CreateSubTree(int combinedFrequency, HuffmanCodeNode highestFrequency, HuffmanCodeNode secondHighestFrequency) { var combinedTreeHead = new HuffmanCodeNode { Frequency = combinedFrequency, Left = highestFrequency, Right = secondHighestFrequency }; return(combinedTreeHead); }
private static void BuildEncodingMap(HuffmanCodeNode huffmanEncodingTree, IDictionary <char, List <bool> > huffmanEncodingMap, List <bool> encoding) { if (huffmanEncodingTree is null) { return; } if (huffmanEncodingTree.Character.HasValue) { huffmanEncodingMap[huffmanEncodingTree.Character.Value] = encoding; return; } var leftEncoding = new List <bool>(encoding); var rightEncoding = new List <bool>(encoding); leftEncoding.Add(false); rightEncoding.Add(true); BuildEncodingMap(huffmanEncodingTree.Left, huffmanEncodingMap, leftEncoding); BuildEncodingMap(huffmanEncodingTree.Right, huffmanEncodingMap, rightEncoding); }