求教LZ4压缩在Linux WML与Windows平台输出结果存在字节差异的原因
问题成因及解决方案
核心成因
你遇到的差异和LZ4压缩算法本身无关,是跨平台文件读写模式不统一导致的:
- Windows平台绝大多数编程语言的标准IO库默认以文本模式打开文件,此时写入数据流中的换行符
\n(十六进制0x0A)会被自动替换为Windows标准换行序列\r\n(十六进制0x0D 0x0A),每遇到一次\n就会多写入1个字节 - Linux/WSL(你提到的WML应为笔误)平台的文本模式不会做这种换行符转换,
\n会原样写入
你遇到的输出文件多2字节、仅头部部分字节有差异、文本文件压缩也会出现相同问题的现象,完全符合上述规则:压缩后的数据流中刚好存在2个\n字节,Windows下文本模式写入时多插入了2个0x0D字节,导致内容和大小都出现差异。你观测到的“前77字节头部”并不是LZ4的标准帧头,就是被换行符转换修改后的压缩数据流。
修复方案
所有读写压缩数据的文件操作,都显式指定二进制模式,禁止操作系统自动修改数据流:
- C/C++:调用
fopen时使用rb/wb参数代替默认的r/w - Python:调用
open时增加b标志,示例:open("output.lz4", "wb") - 其他编程语言同理,均显式声明二进制读写模式即可
内容的提问来源于stack exchange,提问作者Meng
相关产品推荐
相关产品推荐

