コード例 #1
0
 public HuffmanTreeNode(HuffmanTreeNode left, HuffmanTreeNode right)
 {
     Left        = left;
     Right       = right;
     Left.Parent = Right.Parent = this;
     if (ByteCount == null)
     {
         ByteCount = new ByteCount();
     }
     ByteCount.Count = Left.ByteCount.Count + Right.ByteCount.Count;
 }
コード例 #2
0
        /*#ByteCounts*/

        public static ByteCount[] DeserializeByteCount(byte[] ar)
        {
            var result = new ByteCount[ar.Length / 4];
            int ind    = 0;
            int bitPos = 0;

            for (int i = 0; i < ar.Length; i += 4)
            {
                result[ind++] = new ByteCount
                {
                    Byte  = (byte)Utils.GetInt(ar, ref bitPos, 8),
                    Count = Utils.GetInt(ar, ref bitPos, 24)
                };
            }
            return(result);
        }
コード例 #3
0
ファイル: Huffman.cs プロジェクト: KvanTTT/Freaky-Sources
        public HuffmanTree(ByteCount[] bytesFreqs)
        {
            var nodes = new List<HuffmanTreeNode>();
            for (int i = 0; i < bytesFreqs.Length; i++)
                nodes.Add(new HuffmanTreeNode
                {
                    ByteCount = new ByteCount
                    {
                        Byte = bytesFreqs[i].Byte,
                        Count = bytesFreqs[i].Count
                    }
                });

            HuffmanTreeNode left, right;
            while (nodes.Count > 1)
            {
                int min = nodes[0].ByteCount.Count;
                int minInd = 0;
                for (int j = 1; j < nodes.Count; j++)
                    if (min > nodes[j].ByteCount.Count)
                    {
                        min = nodes[j].ByteCount.Count;
                        minInd = j;
                    }
                left = nodes[minInd];
                nodes.RemoveAt(minInd);

                min = nodes[0].ByteCount.Count;
                minInd = 0;
                for (int j = 1; j < nodes.Count; j++)
                    if (min > nodes[j].ByteCount.Count)
                    {
                        min = nodes[j].ByteCount.Count;
                        minInd = j;
                    }
                right = nodes[minInd];
                nodes.RemoveAt(minInd);

                nodes.Add(new HuffmanTreeNode(left, right));
            }

            Root = nodes[0];
            CalculateBytes();
        }
コード例 #4
0
        public static string Decompress_v_1_3(string str, int currentFrame)
        {
            byte[] bytes = Convert.FromBase64String(str);

            int bitPos = 0;
            byte tableLength = (byte)Utils.GetInt(bytes, ref bitPos, 8);

            var bytesFreqs = new ByteCount[tableLength];
            for (int i = 0; i < tableLength; i++)
            {
                bytesFreqs[i] = new ByteCount
                {
                    Byte = (byte)Utils.GetInt(bytes, ref bitPos, 8),
                    Count = Utils.GetInt(bytes, ref bitPos, 24)
                };
            }
            var tree = new HuffmanTree(bytesFreqs);

            int frameDiffsCount = Utils.GetInt(bytes, ref bitPos, 24);
            var frameNumbers = new List<int>();
            int sum = 0;
            frameNumbers.Add(sum);
            for (int i = 0; i < frameDiffsCount; i++)
            {
                sum += Utils.GetInt(bytes, ref bitPos, 9);
                frameNumbers.Add(sum);
            }

            int beginBitPos = bitPos;
            bitPos = frameNumbers[currentFrame] * 8 + beginBitPos;
            int repeatCount = Utils.GetInt(bytes, ref bitPos, 7);
            var frameType = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);
            if (frameType == FrameType.Basic)
            {
                var frameLength = Utils.GetInt(bytes, ref bitPos, BasicBytesLengthBits);
                var frameBytes = HuffmanRle2.Decode(tree, bytes, ref bitPos, frameLength, HuffmanRleRepeatedBits, HuffmanRleNotRepeatedBits);
                return CharsToLine(BytesToFrame(frameBytes));
            }
            else
            {
                int prevFrame = currentFrame;
                int prevRepeatCount;
                FrameType prevFrameType;
                do
                {
                    prevFrame--;
                    bitPos = frameNumbers[prevFrame] * 8 + beginBitPos;
                    prevRepeatCount = Utils.GetInt(bytes, ref bitPos, 7);
                    prevFrameType = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);
                }
                while (prevFrameType != FrameType.Basic);

                var frameLength = Utils.GetInt(bytes, ref bitPos, BasicBytesLengthBits);
                var frame = BytesToFrame(HuffmanRle2.Decode(tree, bytes, ref bitPos, frameLength, HuffmanRleRepeatedBits, HuffmanRleNotRepeatedBits));

                do
                {
                    prevFrame++;
                    bitPos = frameNumbers[prevFrame] * 8 + beginBitPos;
                    prevRepeatCount = Utils.GetInt(bytes, ref bitPos, 7);
                    prevFrameType = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);

                    switch (prevFrameType)
                    {
                        case FrameType.Transitional:
                            break;
                        case FrameType.TransitionalLeft:
                            for (int y = 0; y < FrameHeight; y++)
                                for (int x = 0; x < FrameWidth - 1; x++)
                                    frame[y, x] = frame[y, x + 1];
                            break;
                        case FrameType.TransitionalRight:
                            for (int y = 0; y < FrameHeight; y++)
                                for (int x = FrameWidth - 1; x >= 1; x--)
                                    frame[y, x] = frame[y, x - 1];
                            break;
                        case FrameType.TransitionalTop:
                            for (int y = 0; y < FrameHeight - 1; y++)
                                for (int x = 0; x < FrameWidth; x++)
                                    frame[y, x] = frame[y + 1, x];
                            break;
                        case FrameType.TransitionalBottom:
                            for (int y = FrameHeight - 1; y >= 1; y--)
                                for (int x = 0; x < FrameWidth; x++)
                                    frame[y, x] = frame[y - 1, x];
                            break;
                    }

                    var frameChangesCount = Utils.GetInt(bytes, ref bitPos, 7);
                    for (int i = 0; i < frameChangesCount; i++)
                    {
                        var frameChangeType = (FrameChangeType)Utils.GetInt(bytes, ref bitPos, 2);
                        var position = Utils.GetInt(bytes, ref bitPos, 10);

                        int length;
                        if (frameChangeType == FrameChangeType.One)
                            length = 1;
                        else
                            length = Utils.GetInt(bytes, ref bitPos, frameChangeType == FrameChangeType.Horizontal ? 7 : 4);
                        for (int j = 0; j < length; j++)
                        {
                            frame[GetY(position), GetX(position)] = (char)Utils.GetValue(tree.Root, bytes, ref bitPos);
                            position += frameChangeType == FrameChangeType.Horizontal ? 1 : FrameWidth;
                        }
                    }
                }
                while (prevFrame != currentFrame);

                return CharsToLine(frame).ToString();
            }
        }
コード例 #5
0
 public static byte[] SerializeByteCount(ByteCount[] byteCounts)
 {
     var result = new byte[byteCounts.Length * 4];
     int bitPos = 0;
     foreach (var byteCount in byteCounts)
     {
         Utils.AddInt(result, ref bitPos, byteCount.Byte, 8);
         Utils.AddInt(result, ref bitPos, byteCount.Count, 24);
     }
     return result;
 }
コード例 #6
0
 /*#ByteCounts*/
 public static ByteCount[] DeserializeByteCount(byte[] ar)
 {
     var result = new ByteCount[ar.Length / 4];
     int ind = 0;
     int bitPos = 0;
     for (int i = 0; i < ar.Length; i += 4)
     {
         result[ind++] = new ByteCount
         {
             Byte = (byte)Utils.GetInt(ar, ref bitPos, 8),
             Count = Utils.GetInt(ar, ref bitPos, 24)
         };
     }
     return result;
 }
コード例 #7
0
        public static string Decompress_v_1_3(string str, int currentFrame)
        {
            byte[] bytes = Convert.FromBase64String(str);

            int  bitPos      = 0;
            byte tableLength = (byte)Utils.GetInt(bytes, ref bitPos, 8);

            var bytesFreqs = new ByteCount[tableLength];

            for (int i = 0; i < tableLength; i++)
            {
                bytesFreqs[i] = new ByteCount
                {
                    Byte  = (byte)Utils.GetInt(bytes, ref bitPos, 8),
                    Count = Utils.GetInt(bytes, ref bitPos, 24)
                };
            }
            var tree = new HuffmanTree(bytesFreqs);

            int frameDiffsCount = Utils.GetInt(bytes, ref bitPos, 24);
            var frameNumbers    = new List <int>();
            int sum             = 0;

            frameNumbers.Add(sum);
            for (int i = 0; i < frameDiffsCount; i++)
            {
                sum += Utils.GetInt(bytes, ref bitPos, 9);
                frameNumbers.Add(sum);
            }

            int beginBitPos = bitPos;

            bitPos = frameNumbers[currentFrame] * 8 + beginBitPos;
            int repeatCount = Utils.GetInt(bytes, ref bitPos, 7);
            var frameType   = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);

            if (frameType == FrameType.Basic)
            {
                var frameLength = Utils.GetInt(bytes, ref bitPos, BasicBytesLengthBits);
                var frameBytes  = HuffmanRle2.Decode(tree, bytes, ref bitPos, frameLength, HuffmanRleRepeatedBits, HuffmanRleNotRepeatedBits);
                return(CharsToLine(BytesToFrame(frameBytes)));
            }
            else
            {
                int       prevFrame = currentFrame;
                int       prevRepeatCount;
                FrameType prevFrameType;
                do
                {
                    prevFrame--;
                    bitPos          = frameNumbers[prevFrame] * 8 + beginBitPos;
                    prevRepeatCount = Utils.GetInt(bytes, ref bitPos, 7);
                    prevFrameType   = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);
                }while (prevFrameType != FrameType.Basic);

                var frameLength = Utils.GetInt(bytes, ref bitPos, BasicBytesLengthBits);
                var frame       = BytesToFrame(HuffmanRle2.Decode(tree, bytes, ref bitPos, frameLength, HuffmanRleRepeatedBits, HuffmanRleNotRepeatedBits));

                do
                {
                    prevFrame++;
                    bitPos          = frameNumbers[prevFrame] * 8 + beginBitPos;
                    prevRepeatCount = Utils.GetInt(bytes, ref bitPos, 7);
                    prevFrameType   = (FrameType)Utils.GetInt(bytes, ref bitPos, 3);

                    switch (prevFrameType)
                    {
                    case FrameType.Transitional:
                        break;

                    case FrameType.TransitionalLeft:
                        for (int y = 0; y < FrameHeight; y++)
                        {
                            for (int x = 0; x < FrameWidth - 1; x++)
                            {
                                frame[y, x] = frame[y, x + 1];
                            }
                        }
                        break;

                    case FrameType.TransitionalRight:
                        for (int y = 0; y < FrameHeight; y++)
                        {
                            for (int x = FrameWidth - 1; x >= 1; x--)
                            {
                                frame[y, x] = frame[y, x - 1];
                            }
                        }
                        break;

                    case FrameType.TransitionalTop:
                        for (int y = 0; y < FrameHeight - 1; y++)
                        {
                            for (int x = 0; x < FrameWidth; x++)
                            {
                                frame[y, x] = frame[y + 1, x];
                            }
                        }
                        break;

                    case FrameType.TransitionalBottom:
                        for (int y = FrameHeight - 1; y >= 1; y--)
                        {
                            for (int x = 0; x < FrameWidth; x++)
                            {
                                frame[y, x] = frame[y - 1, x];
                            }
                        }
                        break;
                    }

                    var frameChangesCount = Utils.GetInt(bytes, ref bitPos, 7);
                    for (int i = 0; i < frameChangesCount; i++)
                    {
                        var frameChangeType = (FrameChangeType)Utils.GetInt(bytes, ref bitPos, 2);
                        var position        = Utils.GetInt(bytes, ref bitPos, 10);

                        int length;
                        if (frameChangeType == FrameChangeType.One)
                        {
                            length = 1;
                        }
                        else
                        {
                            length = Utils.GetInt(bytes, ref bitPos, frameChangeType == FrameChangeType.Horizontal ? 7 : 4);
                        }
                        for (int j = 0; j < length; j++)
                        {
                            frame[GetY(position), GetX(position)] = (char)Utils.GetValue(tree.Root, bytes, ref bitPos);
                            position += frameChangeType == FrameChangeType.Horizontal ? 1 : FrameWidth;
                        }
                    }
                }while (prevFrame != currentFrame);

                return(CharsToLine(frame).ToString());
            }
        }
コード例 #8
0
ファイル: Huffman.cs プロジェクト: KvanTTT/Freaky-Sources
 public HuffmanTreeNode(HuffmanTreeNode left, HuffmanTreeNode right)
 {
     Left = left;
     Right = right;
     Left.Parent = Right.Parent = this;
     if (ByteCount == null)
         ByteCount = new ByteCount();
     ByteCount.Count = Left.ByteCount.Count + Right.ByteCount.Count;
 }