void CalculBytes() { Bytes = new Dictionary <int, CompressByte>(); CompressByte NewCompressByte = new CompressByte(); TraverseTree(Root, NewCompressByte); }
// рекурсивная функция обхода дерева void TraverseTree(HaffmanTreeNode Node, CompressByte NewCompressByte) { // пока не добрались до листьев if (Node.Left != null && Node.Right != null) { NewCompressByte.Length++; // высота (ну или глубина) данного узла // если идем в левый потомок, то добавляем 0 TraverseTree(Node.Left, NewCompressByte); // если идем в правый потомок, то добавляем 1 NewCompressByte.Value |= (ushort)(1 << (NewCompressByte.Length - 1)); TraverseTree(Node.Right, NewCompressByte); } else { // добрались до листьев if (NewCompressByte.Length > MaxHeight) // если новая высота дерева больше текущей { MaxHeight = NewCompressByte.Length; } Bytes[Node.Value] = new CompressByte(NewCompressByte); // заполняем массив символов // его длина = 256 (т.к. кодируем по 8 бит) // т.е. для каждого байта вычисляем его код } }
public void EncodeBytes(byte[] Data, ref byte[] CompessData, ref int BytePos, ref byte BitPos) { for (int j = 0; j < Data.Length; j++) { CompressByte B = Bytes[Data[j]]; for (int i = 0; i < B.Length; i++) { CompessData[BytePos] |= (byte)(((B.Value >> i) & 0x1) << BitPos); BitPos = (byte)((BitPos + 1) % 8); if (BitPos == 0) { BytePos++; } } } }
public CompressByte(CompressByte CompressByte) { this.Value = CompressByte.Value; this.Length = CompressByte.Length; }