在C#中实现LZ77压缩算法

时间:2013-08-01 15:49:47

标签: c# algorithm compression

我正在尝试在我的项目中实现压缩算法,它必须是lz77作为一个有效的问题...我已经能够解压缩数据但我无法想象在压缩方面从哪里开始。我认为最好通过带有数据的字节数组来传递,但那就是它...... 我的问题是,算法的所有描述对我来说都是非常神秘的。我将非常感谢该算法如何工作以及我需要注意的内容。 另外:在C#编码时,我是否有义务使用不安全的方法和指针?最好避免这种情况......我想。

到目前为止,这是我给你的信息:

private const int searchWindow = 4095;
    private const byte lookaheadWindow = 15;
    public static byte[] lzCompressData(byte[] input)
    {
        int position = 0;
        List<byte> tempInput = input.ToList();
        List<byte> output = new List<byte>();
        MemoryStream init = new MemoryStream();
        BinaryWriter inbw = new BinaryWriter(init);
        inbw.Write(((input.Length << 8) & 0xFFFFFF00) | 0x10);
        output.AddRange(init.ToArray());
        while (position < input.Length)
        {
            byte decoder = 0;
            List<byte> tempOutput = new List<byte>();
            for (int i = 0; i < 8; ++i)
            {
                List<byte> eligible;
                if(position < 255)
                {
                    eligible = tempInput.GetRange(0, position);
                }
                else
                {
                    eligible = tempInput.GetRange(position - searchWindow, searchWindow);
                }
                if (!(position > input.Length - 8))
                {
                    MemoryStream ms = new MemoryStream(eligible.ToArray());
                    List<byte> currentSequence = new List<byte>();
                    currentSequence.Add(input[position]);
                    int offset = 0;
                    int length = 0;
                    long tempoffset = StreamHelper.FindPosition(ms, currentSequence.ToArray());
                    while ((tempoffset != -1) && (length < lookaheadWindow) && position < input.Length - 8)
                    {
                        offset = (int)tempoffset;
                        length = currentSequence.Count;
                        position++;
                        currentSequence.Add(input[position]);

                    }
                    if (length >= 3)
                    {
                        decoder = (byte)(decoder | (byte)(1 << i));
                        byte b1 = (byte)((length << 4) | (offset >> 8));
                        byte b2 = (byte)(offset & 0xFF);
                        tempOutput.Add(b1);
                        tempOutput.Add(b2);
                    }
                    else
                    {
                        tempOutput.Add(input[position]);
                        position++;
                    }
                }
                else
                {
                    if (position < input.Length)
                    {
                        tempOutput.Add(input[position]);
                        position++;
                    }
                    else
                    {
                        tempOutput.Add(0xFF);
                    }
                }
            }
            output.Add(decoder);
            output.AddRange(tempOutput.ToArray());
        }
        return output.ToArray();
    }

1 个答案:

答案 0 :(得分:3)

  

我会清楚地描述算法是如何工作的   我需要注意什么

很好地解释了here。如果您在理解具体问题时遇到问题,请询问。

  

在C#

编码时,我是否有义务使用不安全的方法和指针

您不必担心任何事情。 无需重新发明轮子。它已经实施了。它的implementation