LZW压缩C#中的字符串

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

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

string _data = "12345"; string _result = CompressToLZW(_data);

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; 

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

使用这样的东西:

 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方法。

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

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

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

您可以将字符串“转换”为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。