如何让zlib或其他库生成Type 01类型的DEFLATE块?
强制zlib生成DEFLATE Type 01(固定哈夫曼编码)块的方法
zlib默认会根据输入数据自动选择压缩率最高的块类型,所以默认情况下只会输出Type 00(无压缩)或Type 02(动态哈夫曼)块,要获得Type 01块可以按以下方式操作:
- 调用zlib压缩接口时指定固定哈夫曼策略
zlib提供了专门的*Z_FIXED*策略参数,设置后会强制编码器使用RFC 1951规定的固定哈夫曼编码生成Type 01块。Python的zlib原生支持该参数,示例代码如下:
生成的流可以直接输入你的DEFLATE解压缩器做测试。import zlib # wbits设为负值表示生成裸DEFLATE流,不带zlib头和校验尾,适配块测试需求 compressor = zlib.compressobj( level=zlib.Z_DEFAULT_COMPRESSION, wbits=-zlib.MAX_WBITS, strategy=zlib.Z_FIXED ) # 测试数据长度建议大于100字节,避免过短触发自动切Type 00块的逻辑 test_data = b"test deflate fixed huffman block " * 20 type01_stream = compressor.compress(test_data) + compressor.flush() - 命令行生成测试文件
如果需要批量生成测试文件,可以使用pigz工具,添加-F参数即可强制输出固定哈夫曼编码块,命令示例:pigz -z -F test_input.txt -c > test_type01.deflate
你可以通过解析块前3位校验块类型:第1位为BFINAL标记,第2-3位为BTYPE,值为01即为所需的Type 01块。
内容的提问来源于stack exchange,提问作者Michal Charemza
相关产品推荐
相关产品推荐

