コード例 #1
0
#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());
        }
コード例 #2
0
        private static HuffmanCodeNode CreateSubTree(int combinedFrequency, HuffmanCodeNode highestFrequency, HuffmanCodeNode secondHighestFrequency)
        {
            var combinedTreeHead =
                new HuffmanCodeNode
            {
                Frequency = combinedFrequency,
                Left      = highestFrequency,
                Right     = secondHighestFrequency
            };

            return(combinedTreeHead);
        }
コード例 #3
0
        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);
        }