在C#中解压缩文本

时间:2015-05-05 14:51:51

标签: c# zip gzip compression

我有一个问题,我正在敲打我的头,我试图以这种格式解压缩文本:

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行上发现了无效数据的错误,它应该解压缩为“密码”,但我不确定它为什么不能正常工作。

如果有人知道为什么或其他图书馆可以工作,我很想知道!

谢谢!

修改

我没有运气就尝试了LZW算法,我认为它是zip,因为标题表示它是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转换,也尝试了我能想到的各种类型的编码。

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

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

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

我建议您查看DotNetZip

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  

Compress是一个基于Unix的压缩程序。使用Compress压缩文件后,可以使用uncompress实用程序将文件恢复到其原始状态。解压缩恢复压缩文件的属性

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

  

Compress是一个基于LZW压缩算法的Unix shell压缩程序。

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

答案 3 :(得分:1)

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

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

不幸的是,还存在一个问题:压缩数据不是zip存档。作为Ron Beyer pointed out,它是LZW压缩。 SharpLZW是可以在.Net中读取的库的一个示例。

答案 4 :(得分:0)

压缩程序正在使用unix压缩软件

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

  

Compress是一个基于LZW压缩算法的Unix shell压缩程序。[1]与更现代的压缩实用程序(如gzip和bzip2)相比,压缩执行速度更快,内存使用更少,但压缩率却显着降低。

我已经搜索了一些预建的库并找到了http://www.codeproject.com/Articles/6838/LZW-Compression由于该算法实际上属于公共域,因此您可以自己构建它以获得乐趣。 :D指向实施的链接是:http://warp.povusers.org/EfficientLZW/

答案 5 :(得分:0)

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

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

我不知道ASCII是否就在这里,因为解码后的文本是

x?{?{Abqqy~Q'??

也许你必须使用zip。