如何在Python中正确编码字符串以使用zlib进行解压缩
Python中zlib解压缩JSON序列化字符串的解决方法
核心问题
你遇到的zlib.error: Error -3 while decompressing data: incorrect header check错误,根源在于:Go端的zlib压缩字节数组被JSON序列化后,Python通过json.loads得到的字符串并非原始二进制的直接映射——因为JSON不支持二进制类型,Go标准库encoding/json会自动把[]byte编码为Base64字符串,而Python不会自动解码这个Base64字符串为bytes,直接用UTF-8编码转换会破坏原始压缩数据的结构。
解决方案
先对字符串进行Base64解码还原为原始压缩字节,再执行zlib解压:
import zlib import base64 # s 是 json.loads 后得到的压缩字符串 compressed_bytes = base64.b64decode(s) uncompressed_data = zlib.decompress(compressed_bytes) # 如果解压后是文本,可根据实际编码转成字符串,例如: # uncompressed_str = uncompressed_data.decode('utf-8')
通常不需要额外设置wbits参数,因为Go的zlib.NewReader默认使用标准zlib头,和Pythonzlib.decompress的默认参数(wbits=15)完全兼容。
为什么之前的尝试无效?
你用s.encode()、bytearray(s, 'utf-8')等方式,是把Base64字符串当作UTF-8文本转换为bytes,但Base64字符串是二进制数据的编码形式,并非合法的UTF-8文本,这种转换会改变原始压缩数据的字节值,导致zlib无法识别正确的压缩头,从而抛出错误。
对应Go端的逻辑验证
Go端的完整流程是:
- 对数据进行zlib压缩得到
[]byte - 序列化结构体时,
encoding/json自动将[]byte编码为Base64字符串 - 数据通过网络传输到Python端
- Python用
json.loads解析后得到Base64格式的字符串
Python需要完全反向操作:先Base64解码还原压缩字节,再zlib解压,才能和Go端的处理逻辑匹配。
内容的提问来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

