【发布时间】:2012-12-27 17:33:05
【问题描述】:
我将如何编写一种方法来压缩不包含头文件的 Gzip 字符串,并将其压缩到我解压缩它之前的状态。原始压缩是在 C# 中完成的,我在 Ruby 中使用以下方法进行膨胀:
编辑:基本上,我想要匹配的 deflate 方法到这个膨胀:
def inflate(string)
zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
解压前的字符串为:
"5\x891\n\xC30\x10\x04{\xBDb\xEB\xE0F&\x81\xA4\xCA3\xDC\xA81\xD2\x1A]\xA1\x13\xB1.\x100\xFEF\xDE\e\x19\x9Cb\x99Yf\xCA\xB3A\x1A,\x13\xB1\x96R\x15I\x96\x85+5\x12\xA2=\xF4:\xAFb\xB9\xD0$\xA2\xF1\xF5>\xDA\xD3\xB9\x9A\xA8f\xFC\xD8\xE6\xFD\x00\x7F\xEB{\f!Uk{\xCF,\x91\xDC\x1C\x10J\xC4\xF7z\xCA\xE8p9\xF8\xFF\xF7\x93\xDEw\xD9\x7F"
而使用inflate解压后就是:
"What is the common difference in this arithmetic sequence?\n\n\\indenttext{11, 15, 19,\\dots}\n\n\\emcee{\n \\mc \x964\n \\mc 2\n *\\mc 4\n \\mc 8\n \\mc 11\n }"
我尝试创建多个 deflate 方法,但没有一个可以将其恢复为原始方法。感谢您的帮助!
编辑:原始压缩是在 .NET 2.0 中使用以下方法完成的
byte[] compressedStringBytes = CompressGzipString(String);
而 CompressGzipString 确实如此:
MemoryStream compressed = new MemoryStream();
DeflaterOutputStream zosCompressed = new DeflaterOutputStream(compressed, new Deflater(Deflater.BEST_COMPRESSION, true));
zosCompressed.Write(data, 0, data.Length);
如果无法将其还原为确切的原件,那么最标准化的压缩是什么,我的意思是一般性,并且能够以与原件相同的方式解压缩?
【问题讨论】:
-
你能解释一下它是如何在 C# 中被压缩的吗?
-
是的,有关该信息,请参阅原始帖子!
-
这看起来像 Java 代码,而不是 C#。
-
@Hyung:使用的对象 -
CompressGzipString和Deflator- 不是标准 .NET 库的一部分。他们是从哪里来的? -
发现错误。在“解压缩字符串之前”中的 \xB9 和 \x9A 之间缺少空格。您一定是无意中删除了它。加上空格后,“解压后”则匹配解压后的结果。
标签: ruby compression gzip deflate