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; } }
// рекурсивная функция обхода дерева 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 HaffmanTreeNode(ByteCount ByteCount) { this.Value = ByteCount.Byte; this.ByteCount = ByteCount.Count; this.Left = null; this.Right = null; this.Parent = null; }
public HaffmanTreeNode(byte Value, int ByteCount) { this.Value = Value; this.ByteCount = ByteCount; this.Left = null; this.Right = null; this.Parent = null; }
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; }
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 }
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(); }