LZW压缩C#中的字符串

时间:2011-07-15 16:11:06

标签: c# javascript compression lzw

我在C#中寻找一个LZW压缩算法,它采用“字符串”并返回一个字符串。 我已经谷歌搜索了几个小时,所有我发现使用MemoryStream,BinaryWriters等。

我只是希望能够做到这样的事情:

string _data = "12345";

string _result = CompressToLZW(_data);

然后通过Ajax将该字符串传递给浏览器。我已经有了javascript的LZW解压缩算法(http://rosettacode.org/wiki/LZW_compression#JavaScript)

感谢.-

更新:

这是我正在使用http://paste.lisp.org/display/12198的代码

    string _data = "12345_12345_12345_12345";

    byte[] byteArray = Encoding.ASCII.GetBytes(_data);

    MemoryStream _st = new MemoryStream(byteArray);

    StreamReader _sr = new StreamReader(_st);

    MemoryStream streamoutput = new MemoryStream();

    BinaryWriter _output= new BinaryWriter(streamoutput);

    LZW.Compress(_sr, _output);

    string _res = (new StreamReader(_output.BaseStream)).ReadToEnd();

    return _res;

string _data = "12345_12345_12345_12345"; byte[] byteArray = Encoding.ASCII.GetBytes(_data); MemoryStream _st = new MemoryStream(byteArray); StreamReader _sr = new StreamReader(_st); MemoryStream streamoutput = new MemoryStream(); BinaryWriter _output= new BinaryWriter(streamoutput); LZW.Compress(_sr, _output); string _res = (new StreamReader(_output.BaseStream)).ReadToEnd(); return _res;

更新2 我在C#中找到了一个源代码来完成http://code.google.com/p/sharp-lzw/source/browse/的工作 感谢.-

3 个答案:

答案 0 :(得分:3)

使用类似的东西:

private string CompressToLZW(string input)
{
    using (MemoryStream stream = new MemoryStream())
    {
        ComputeLZW(input, stream);
        stream.Seek(0, SeekOrigin.Begin);
        using (StreamReader reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}

其中ComputeLZW()是您使用流的LZW方法。

答案 1 :(得分:1)

鉴于LZW代码不一定需要落在字节边界上,只需将LZW压缩的二进制输出转换为UTF8字符串(与StreamReader方法一样)很可能会失败,从而产生非法输出。

您所引用的Javascript解压缩功能似乎实际上以数组为输入。将二进制输出传递给javascript解压缩方法的最有效方法可能是对二进制输出进行base64编码,然后将JS端的base64解码为数组,并将其提供给您的方法。

这可能是有问题的效率。在部署之前值得测试。

答案 2 :(得分:0)

您可以将字符串“转换”为MemoryStrem,如下所示:

byte[] byteArray = Encoding.ASCII.GetBytes(youInputString);
MemoryStream stream = new MemoryStream(byteArray);

(确保您了解所需的编码)。

另一种方式是这样的:

StreamReader reader = new StreamReader(methodOutputStream);
string text = reader.ReadToEnd();

要使用http://paste.lisp.org/display/12198上的方法,您可以先将字符串转换为Stream,将其提供给LZW压缩方法,接收输出Stream,然后将该流转换为字符串。唯一的区别是网站上的代码使用FileStreams。