1

我正在寻找 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;

更新 2 我在 C# 中找到了可以在http://code.google.com/p/sharp-lzw/source/browse/ 处工作的源代码。

4

3 回答 3

4

使用这样的东西:

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

于 2011-07-15T16:17:35.040 回答
2

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

您提到的 Javascript 解压缩函数似乎实际上将一个数字数组作为其输入。将二进制输出传送到 javascript 解压缩方法的最有效方法可能是将二进制输出进行 base64 编码,然后在 JS 端将 base64 解码为数字数组并将其提供给您的方法。

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

于 2011-07-15T16:28:14.503 回答
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。

于 2011-07-15T16:27:59.503 回答