コード例 #1
0
 public void DecodeBytes(byte[] CompressData, ref byte[] Data, ref int BytePos, ref byte BitPos)
 {
     for (int j = 0; j < Data.Length; j++)
     {
         int             Bit;
         HaffmanTreeNode Node = Root;
         byte            h    = 0;
         while (Node.Left != null)
         {
             Bit = CompressData[BytePos] & (1 << BitPos);
             if (Bit == 0)
             {
                 Node = Node.Left;
             }
             else
             {
                 Node = Node.Right;
             }
             BitPos = (byte)((BitPos + 1) % 8);
             if (BitPos == 0)
             {
                 BytePos++;
             }
             h++;
         }
         Data[j] = Node.Value;
     }
 }
コード例 #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 HaffmanTreeNode(ByteCount ByteCount)
 {
     this.Value     = ByteCount.Byte;
     this.ByteCount = ByteCount.Count;
     this.Left      = null;
     this.Right     = null;
     this.Parent    = null;
 }
コード例 #4
0
 public HaffmanTreeNode(byte Value, int ByteCount)
 {
     this.Value     = Value;
     this.ByteCount = ByteCount;
     this.Left      = null;
     this.Right     = null;
     this.Parent    = null;
 }
コード例 #5
0
 public HaffmanTreeNode(byte Value, int ByteCount, bool Leaf,
                        HaffmanTreeNode Left, HaffmanTreeNode Right, HaffmanTreeNode Parent)
 {
     this.Value     = Value;
     this.ByteCount = ByteCount;
     this.Left      = Left;
     this.Right     = Right;
     this.Parent    = Parent;
 }
コード例 #6
0
        public int ByteCount;                       // количество байт (у всех потомков)

        // конструкторы
        public HaffmanTreeNode(HaffmanTreeNode Left, HaffmanTreeNode Right)
        {
            this.Left      = Left;
            this.Right     = Right;
            Left.Parent    = this;
            Right.Parent   = this;
            this.ByteCount = Left.ByteCount + Right.ByteCount;
            //this.Value = 0;         // default value
        }
コード例 #7
0
        public HaffmanTree(ByteCount[] MeetingBytes)
        {
            MaxHeight = 0;
            List <HaffmanTreeNode> Nodes = new List <HaffmanTreeNode>();

            for (int i = 0; i < MeetingBytes.Length; i++)
            {
                Nodes.Add(new HaffmanTreeNode(MeetingBytes[i]));
            }

            HaffmanTreeNode Left, Right;

            while (Nodes.Count > 1)
            {
                int Min    = Nodes[0].ByteCount;
                int MinInd = 0;
                for (int j = 1; j < Nodes.Count; j++)
                {
                    if (Min > Nodes[j].ByteCount)
                    {
                        Min    = Nodes[j].ByteCount;
                        MinInd = j;
                    }
                }
                Left = Nodes[MinInd];
                Nodes.RemoveAt(MinInd);

                Min    = Nodes[0].ByteCount;
                MinInd = 0;
                for (int j = 1; j < Nodes.Count; j++)
                {
                    if (Min > Nodes[j].ByteCount)
                    {
                        Min    = Nodes[j].ByteCount;
                        MinInd = j;
                    }
                }
                Right = Nodes[MinInd];
                Nodes.RemoveAt(MinInd);

                Nodes.Add(new HaffmanTreeNode(Left, Right));
            }

            Root = Nodes[0];

            CalculBytes();
        }