如何在golang中使用zlib与c中的zlib配合?

时间:2015-01-09 02:28:17

标签: go compression zlib

我发现,对于相同的字符串,在golang中使用zlib的结果与c中的结果不同。如何通过zlib压缩golang并在c中解压缩?哪个版本可以使用?

2 个答案:

答案 0 :(得分:4)

仅仅因为压缩数据不同并不意味着它不能被解压缩。任何地方生成的符合zlib标准的压缩数据都可以通过兼容的zlib解码器进行解压缩。你尝试过解压吗?

至于差异,@ twotwotwo指出Go中的compress / zlib 原始zlib库,而是用Go编写的不同实现。因此,如果它使用不同的算法来查找匹配和/或发出块,则会产生不同的输出。

答案 1 :(得分:2)

作为背景,Go没有附带zlib库,compress/zlib只有它的名字'因为它适用于zlib格式数据。虽然格式相同,但压缩算法的细节却不是(例如,导致Go库的worse speed and slightly worse compression)。因此,即使在相同的压缩级别和相同的包装器上,输出通常也不会匹配。

zlib(Mark Adler)的作者的回答提出了一个基本观点,即不同的输出并不意味着zlib无法解压缩输出。我认为这是你真正的答案,但剩下的其余部分因为它有一些非重叠的信息,关于Go在Go中做什么/你的选择。


Vitess project(YouTube的内部MySQL代理)需要为其应用程序提供C zlib的速度,因此他们编写了一个适配器cgzip。你没有说出你想要输出的格式;如果答案不是gzip,你必须分叉并修改cgzip,以便调用zlib的正确位来生成你需要的东西。

使用cgzip或类似的优点是它会像zlib一样,因为它使用的是zlib。缺点是你将不再拥有pure-Go应用程序,因此你将失去琐碎的交叉编译并获得对程序构建和运行环境的额外依赖(尽管在zlib的情况下,无处不在和稳定的API意味着将它作为dep而不是某些库的问题要小得多。