在Java中解压zlib压缩字符串

2 投票
2 回答
3525 浏览
提问于 2025-04-16 15:01

我有一个Java模块,它从一个远程的Python脚本接收一个压缩过的字符串。这个Python脚本是用zlib.compress()来压缩字符串的。我只是想在Java中解压缩这个字符串,然后显示给用户。

Java自带的zip.Deflater对象的说明文档里很清楚地描述了如何解压缩用zlib.compress()压缩的内容。不过,这个方法对我来说并不奏效。根据我使用的编码方式,我要么收到“错误的头部检查”错误,要么解压缩后得到一个空字符串。

那么,我该怎么解压缩呢?数据在传输过程中没有损坏,而且压缩后的字符串以“x\x9c”开头,这显然是zlib压缩内容的合适格式。

我以前从未处理过这种级别的压缩和解压缩,现在感到有些困惑。为了额外的帮助,我希望能得到关于压缩/解压缩和膨胀/收缩之间的解释。根据这个链接,它们是不同的,但大多数网站似乎把它们混用在zlib上。这让我更难找到解决方案,因为我无法判断自己到底是在“解压缩”还是“膨胀”这些数据。

2 个回答

0

看起来Python的zlib.compress()是用gzip格式的,你确定要用nowrap参数来创建Inflater,以便进行gzip兼容的解压吗?

我觉得Inflate和deflate这两个词只和DEFLATE算法有关,而compress和uncompress则是更通用的术语。

2

这个困惑是因为有些聪明人把 zlib 协议称作“deflate”。你可以看看在 这些 Java 文档 中提到的 RFC 文档,可能会对你有帮助。

还有 这个 Stack Overflow 的话题 也很相关。

我建议你在 Python (A) 中运行

print repr(zlib.compress("The quick brown dog etc etc")

然后把这个结果和用 Deflater 的等效 Java 代码 (B) 的结果进行比较。同时确保你能把 B 解压缩回你的测试输入。检查一下你在 Python 或 Java 中是否遇到了 unicode 和字节之间的复杂问题。

你有没有尝试过按照你引用的 SO 话题中 @patthoyts 的回答来做 Python 的“deflate”?

撰写回答