You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成带可选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:33:18