我有一个问题,我正在敲打我的头,我试图以这种格式解压缩文本:
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转换,也尝试了我能想到的各种类型的编码。
有什么想法吗?
答案 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。