Пример #1
0
        void CalculBytes()
        {
            Bytes = new Dictionary <int, CompressByte>();
            CompressByte NewCompressByte = new CompressByte();

            TraverseTree(Root, NewCompressByte);
        }
Пример #2
0
        // рекурсивная функция обхода дерева
        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 бит)
                // т.е. для каждого байта вычисляем его код
            }
        }
Пример #3
0
 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++;
             }
         }
     }
 }
Пример #4
0
 public CompressByte(CompressByte CompressByte)
 {
     this.Value  = CompressByte.Value;
     this.Length = CompressByte.Length;
 }