zlib 的“解压缩”是不是保留数据的原始字节序,还是进行字节序转换?
Posted
技术标签:
【中文标题】zlib 的“解压缩”是不是保留数据的原始字节序,还是进行字节序转换?【英文标题】:Does zlib's "uncompress" preserve the data's original endianness, or does it do an endian conversion?zlib 的“解压缩”是否保留数据的原始字节序,还是进行字节序转换? 【发布时间】:2015-05-26 15:13:34 【问题描述】:我正在使用访问在 sqlite 数据库中压缩的两字节整数数据的遗留 C++ 代码。该代码使用 zlib 的 uncompress 函数来提取数据,这些数据在我的 little-endian 机器上作为 little-endian 值输出。
为了考虑到这段代码可能被移植到大端机器上的可能性,我需要知道数据是否总是以小端顺序解压缩,或者 zlib 是否会以某种方式进行转换。
这是我能找到的唯一适用的花絮(来自他们网站上的 zlib 的常见问题解答):
zlib 将在大端或小端架构上工作,我可以在它们之间交换压缩数据吗? 是的,是的。
并没有真正回答我的问题...如果需要,我已准备好处理字节序转换。无论您在哪个平台上运行解压缩,都可以安全地假设原始输入数据字节序是您返回的内容吗? (我目前无法访问自己测试的大端机器)。
【问题讨论】:
我怀疑 zlib 在字节流上工作,所以在任何情况下它都不会反转任何字节。 【参考方案1】:zlib 无损压缩和解压缩字节流。因此,无论输入什么字节序,结果都是如此。这完全与压缩和解压缩机器的字节序无关。
FAQ 条目是指代码被编写为对编译和运行代码的架构的字节顺序不敏感。
【讨论】:
谢谢!我假设可能是这种情况,但想在继续之前验证我的假设。 如果它期望小端但找到大端怎么办? (我收到“解压缩数据”错误,我正在尝试对此进行调查......) 如果 what 需要小端序怎么办?【参考方案2】:RFC1950具体说明了zlib的自己的元数据多字节值是如何存储的:
在计算机中,一个数字可能占用多个字节。此处描述的格式中的所有多字节数字都以 MOST 有效字节首先存储(在较低的内存地址)。例如十进制数 520 存储为:
0 1 +--------+--------+ |00000010|00001000| +--------+--------+ ^ ^ | | | + less significant byte = 8 + more significant byte = 2 x 256
所以关于多字节值的操作 internal 使用 zlib必须 考虑字节顺序(这是常见问题解答 #26 的回答)。
压缩后的数据本身不会改变,因为 zlib 以字节为粒度进行压缩和解压缩,而不是更大的单位。
【讨论】:
以上是关于zlib 的“解压缩”是不是保留数据的原始字节序,还是进行字节序转换?的主要内容,如果未能解决你的问题,请参考以下文章
webservice(axis)接口上传文件附件 及 用zlib解压缩