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。