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

如何在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端的完整流程是:

  1. 对数据进行zlib压缩得到[]byte
  2. 序列化结构体时,encoding/json自动将[]byte编码为Base64字符串
  3. 数据通过网络传输到Python端
  4. Python用json.loads解析后得到Base64格式的字符串

Python需要完全反向操作:先Base64解码还原压缩字节,再zlib解压,才能和Go端的处理逻辑匹配。

内容的提问来源于stack exchange,提问作者Shane Bishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:50:24