Python zlib压缩级别错误排查与编码逻辑修正求助
问题分析与修复
错误原因
zlib.compress的第二个参数是压缩级别,合法取值范围为0-9,或zlib.Z_NO_COMPRESSION、zlib.Z_BEST_SPEED、zlib.Z_BEST_COMPRESSION、zlib.Z_DEFAULT_COMPRESSION这类常量。你直接将解码时的15 | 32(计算值为47)传入这个参数,该值完全超出压缩级别的合法范围,因此触发Bad compression level错误。
注:15 | 32是zlib.decompress的wbits参数,作用是指定窗口大小(2^15)并自动检测zlib/gzip压缩头,和压缩函数的级别参数含义完全不同。
修复方案
方法1:使用默认压缩级别(推荐)
直接替换压缩级别为合法值,同时确保base64编码结果转为字符串(匹配解码函数的输入类型):
import zlib import base64 def decode_level(level_data: str) -> str: base64_decoded = base64.urlsafe_b64decode(level_data.encode()) decompressed = zlib.decompress(base64_decoded, 15 | 32) return decompressed.decode() def encodeLevelData(lvlData: str) -> str: eData = lvlData.encode() # 使用默认压缩级别,等价于级别6 compressed = zlib.compress(eData, zlib.Z_DEFAULT_COMPRESSION) # 将bytes类型的base64结果转为字符串 b64_encoded = base64.urlsafe_b64encode(compressed).decode() return b64_encoded
方法2:明确匹配窗口大小设置
如果需要严格对齐解码时的窗口大小配置,可使用zlib.compressobj手动指定wbits参数:
import zlib import base64 def encodeLevelData(lvlData: str) -> str: eData = lvlData.encode() # 初始化压缩对象,指定压缩级别和窗口大小(15对应2^15,和解码时一致) compressor = zlib.compressobj( zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, 15 ) compressed = compressor.compress(eData) + compressor.flush() b64_encoded = base64.urlsafe_b64encode(compressed).decode() return b64_encoded
验证逻辑
使用修复后的编码函数处理测试字符串,再通过decode_level解码,应能还原原始字符串,证明编解码流程一致。
内容的提问来源于stack exchange,提问作者CrisDev
相关产品推荐
相关产品推荐

