如何生成带可选CRC16字段的合法gzip文件用于测试自定义解压器?
生成带FHCRC(CRC16)字段的gzip测试文件方法
这个FHCRC特性是RFC1952规范里明确包含的,不是未启用的部分,只是常用工具默认不生成这类文件,你可以通过以下两种方式生成:
方法一:用Python手动构造
直接写代码生成符合要求的gzip文件,同时可以方便地修改CRC16值来测试解压器的错误处理逻辑:
import zlib import struct def create_gzip_with_fhCRC(input_data): # 构造基础gzip头(符合RFC1952格式) # ID1(0x1f)、ID2(0x8b)、CM(DEFLATE=8)、FLG(设置FHCRC标志位0x02) # 加上MTIME、XFL、OS字段 base_header = struct.pack('<BBBBIbb', 0x1f, 0x8b, 0x08, 0x02, 0, 0, 3) # 计算基础头的CRC16(取CRC32的低16位,小端序) crc16 = zlib.crc32(base_header) & 0xffff # 拼接完整头部(基础头+CRC16) full_header = base_header + struct.pack('<H', crc16) # 生成原始DEFLATE压缩数据(不带zlib头) compressed_data = zlib.compress(input_data, zlib.DEFLATED, wbits=-15) # 构造gzip尾部(原始数据的CRC32和长度) crc32 = zlib.crc32(input_data) & 0xffffffff data_len = len(input_data) & 0xffffffff trailer = struct.pack('<II', crc32, data_len) # 组合所有部分 return full_header + compressed_data + trailer # 生成测试文件 with open('test_fhcrc.gz', 'wb') as f: f.write(create_gzip_with_fhCRC(b'Test content for FHCRC validation'))
如果要测试错误场景,只需要修改代码里的crc16值,比如改成crc16 ^ 0xffff,就能生成CRC16无效的gzip文件。
方法二:修改现有gzip文件
用普通gzip命令生成文件后,通过十六进制编辑器手动修改添加FHCRC字段:
- 先生成普通gzip文件:
gzip -c your_input.txt > normal.gz - 用十六进制编辑器打开
normal.gz,找到偏移3的字节(第4个字节,对应FLG字段),将其值改为0x02(开启FHCRC标志) - 计算偏移0到偏移9的10字节数据的CRC32值,取低16位,转换成小端字节序(比如CRC32是0x12345678,取低16位0x5678,小端就是0x78 0x56)
- 在偏移10的位置插入这两个字节,后面的压缩数据和尾部整体后移2字节
- 保存后就得到带FHCRC的合法gzip文件
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

