在 C# 中解压文本

Decompressing text in C#

我遇到了一个问题,我正在尝试解压缩这种格式的文本:

eJx7v3t/QWJxcXl+UQoAJ94F3Q==

我遇到的问题是它在这个网站上运行得很好: http://www.unit-conversion.info/texttools/compress/

但我似乎无法让它与 C# 一起工作,我尝试了 Gzip 和 Zip,但它们都抛出了无效数据错误。

using (Stream fs = GenerateStreamFromString("eJx7v3t/QWJxcXl+UQoAJ94F3Q=="))
{
    using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Read))
    {
        //Do stuff
    }
}

public Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

它会在 ZipArchive 行上显示无效数据的错误,它应该解压缩到 "password" 但我不确定为什么它不起作用。

如果有人知道为什么或另一个库可以工作,我很想知道!

谢谢!

编辑

我尝试了 LZW 算法,但没有成功,我认为它是 zip,因为 header 说它是 gzip 压缩的,但由于缺少文档,我不确定数据是如何压缩的。

这是我的 LZW 示例代码。

byte[] decodedBytes = Convert.FromBase64String("eJx7v3t/QWJxcXl+UQoAJ94F3Q==");
String text = System.Text.Encoding.UTF8.GetString(decodedBytes);

SharpLZW.LZWDecoder test = new SharpLZW.LZWDecoder();
string testval = test.Decode(text);

解码是我得到错误的地方,我尝试了有和没有 Base64 转换,也尝试了我能想到的每种编码类型。

有什么想法吗?

看起来你的压缩文本是 Base64 字符串,你可以先尝试 base64 到二进制对话,然后再尝试 zip 库。

您link 声称其使用的压缩算法是 unix compress 的网站。

Compress is a Unix based compress program. Once a file is compressed using Compress, you can restore the file to its original state with the uncompress utility. Uncompress restores attributes of a compressed file

A brief bit of research 得出结论这是 LZW 压缩。

Compress is a Unix shell compression program based on the LZW compression algorithm.

您需要此的 .NET 实现 - SharpLZW 是我找到的第一个。

压缩程序使用的是unix压缩软件

http://en.wikipedia.org/wiki/Compress

Compress is a Unix shell compression program based on the LZW compression algorithm.[1] Compared to more modern compression utilities such as gzip and bzip2, compress performs faster and with less memory usage, at the cost of a significantly lower compression ratio.

我搜索了一些预构建的库并找到了 http://www.codeproject.com/Articles/6838/LZW-Compression Since th algorithm is actually in the public domain you could build it yourself for fun. :D A link to the implementation is: http://warp.povusers.org/EfficientLZW/

eJx7v3t/QWJxcXl+UQoAJ94F3Q== 看起来像一个 base64 编码的字符串。在尝试解压缩之前,您需要使用 proper method 对其进行解码。

byte[] decodedBytes = Convert.FromBase64String("eJx7v3t/QWJxcXl+UQoAJ94F3Q==");

不幸的是,还有一个问题:压缩数据不是 zip 存档。 , it's LZW compression. SharpLZW 是一个可以在 .Net 中读取的库示例。

我认为您 Base64 编码不是 Zip 格式。尝试这样的事情:

var bytes = Convert.FromBase64String("eJx7v3t/QWJxcXl+UQoAJ94F3Q==");
var text = Encoding.ASCII.GetString(bytes);

我不知道 ASCII 编码是否是这里的正确选择,因为解码后的文本是:

x?{?{Abqqy~Q '??

也许你必须使用 zip。

这是 zlib 流的 Base-64 编码,不是 gzip,也不是 zip。您可以使用 zlib 对其进行解码。它解压缩到 ef bb bf 70 61 73 73 77 6f 72 64。 (最后八个字节是"password"。)

快速阅读文档表明 .NET 没有 zlib 解码器。您可以使用 RFC 1950 编写自己的 zlib header 和尾部处理代码,然后使用 DeflateStream class 来解压缩原始压缩数据。虽然你可能 shouldn't use .NET for compression.

我建议查看 DotNetZip