我正在使用遗留的C ++代码来访问在sqlite数据库中压缩的双字节整数数据。代码使用zlib的uncompress函数来提取数据,这些数据在我的little-endian机器上作为little-endian值出现。
为了允许将此代码移植到big-endian机器,我需要知道数据是否总是以little-endian顺序解压缩,或者是否(而不是)zlib以某种方式进行转换。
这是我能找到的唯一适用的小故事(来自zlib在其网站上的常见问题解答):
- zlib是否可以在big-endian或little-endian架构上工作,我可以在它们之间交换压缩数据吗? 是的,是的。
醇>
没有真正回答我的问题......如果需要,我已准备好处理字节序转换。可以安全地假设原始输入数据字节顺序是您返回的内容,无论您运行解压缩的平台是什么? (我目前无法访问大端机器来自行测试)。
答案 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以字节的粒度压缩和解压缩,而不是更大的单位。