zlib的“解压缩”是保留数据的原始字节顺序还是进行字节序转换?

时间:2015-05-26 15:13:34

标签: zlib endianness compression

我正在使用遗留的C ++代码来访问在sqlite数据库中压缩的双字节整数数据。代码使用zlib的uncompress函数来提取数据,这些数据在我的little-endian机器上作为little-endian值出现。

为了允许将此代码移植到big-endian机器,我需要知道数据是否总是以little-endian顺序解压缩,或者是否(而不是)zlib以某种方式进行转换。

这是我能找到的唯一适用的小故事(来自zlib在其网站上的常见问题解答):

  
      
  1. zlib是否可以在big-endian或little-endian架构上工作,我可以在它们之间交换压缩数据吗?   是的,是的。
  2.   

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

2 个答案:

答案 0 :(得分:2)

zlib无损压缩和解压缩字节流。因此无论进展到底是什么结果都是出来的。这完全与压缩和减压机器的结束无关。

FAQ条目指的是这样的代码被编写为对代码编译并运行的体系结构的endianess不敏感。

答案 1 :(得分:1)

RFC1950明确说明了如何存储zlib的拥有的元数据多字节值:

  

在计算机中,数字可能占用多个字节。这里描述的格式的所有多字节数字首先存储在MOST有效字节中(在较低的存储器地址处)。例如,十进制数520存储为:

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

因此,关于内部使用zlib 的多字节值的操作必须考虑字节序(这是FAQ#26回答的问题)。

压缩数据本身将保持不变,因为zlib以字节的粒度压缩和解压缩,而不是更大的单位。