zlib 的 "uncompress" 是保留数据的原始字节序,还是进行字节序转换?

Does zlib's "uncompress" preserve the data's original endianness, or does it do an endian conversion?

我正在使用旧版 C++ 代码访问压缩在 sqlite 数据库中的两字节整数数据。该代码使用 zlib 的解压缩函数来提取数据,这些数据在我的小端机器上作为小端值出现。

为了允许将此代码移植到大端机器的可能性,我需要知道数据是否总是以小端顺序解压缩,或者(相反)zlib 是否会以某种方式进行转换。

这是我能够找到的唯一适用的花絮(来自他们网站上的 zlib 常见问题解答):

  1. Will zlib work on a big-endian or little-endian architecture, and can I exchange compressed data between them? Yes and yes.

没有真正回答我的问题...如果需要,我准备处理字节序转换。无论您 运行 在哪个平台上解压缩,假设原始输入数据的字节顺序就是您返回的内容是否安全? (我目前无法访问大端机器来自己测试)。

zlib 无损压缩和解压缩字节流。因此,无论输入什么字节序,输出的都是什么。这完全与压缩和解压缩机器的字节顺序无关。

FAQ 条目指的是这样一个事实,即编写的代码对代码编译到的体系结构的字节顺序不敏感,运行。

RFC1950 具体说明了 zlib 的 own 元数据多字节值是如何存储的:

Within a computer, a number may occupy multiple bytes. All multi-byte numbers in the format described here are stored with the MOST-significant byte first (at the lower memory address). For example, the decimal number 520 is stored as:

         0     1
     +--------+--------+
     |00000010|00001000|
     +--------+--------+
      ^        ^
      |        |
      |        + less significant byte = 8
      + more significant byte = 2 x 256

因此,关于 internal 使用 zlib 的多字节值的操作必须 考虑字节顺序(这是 FAQ #26 回答的内容).

压缩后的数据本身不会发生变化,因为 zlib 以字节为粒度进行压缩和解压缩,而不是更大的单位。