Python:URL编码无填充Base64解码为JSON失败求助
问题解决:二进制协议数据解析而非JSON解析
你之前的核心错误是将二进制协议数据误当作JSON文本解析——解码后的字节串并非UTF-8/ASCII编码的JSON内容,而是按照自定义二进制协议打包的结构化数据,必须按协议规定的字段长度、字节序(大端/小端)来解析每个字段。
具体解决步骤
明确数据结构:根据你的预期结果,反推协议的二进制结构(需和实际通信协议一致):
- 第1字节:
length(无符号整数) - 后续13字节:
payload,包含:- 2字节:
src(无符号短整数) - 2字节:
dst(无符号短整数) - 1字节:
serial(无符号字节) - 1字节:
dev_type(无符号字节) - 1字节:
cmd(无符号字节) - 8字节:
timestamp(毫秒级时间戳,64位整数)
- 2字节:
- 最后1字节:
crc8(无符号字节)
- 第1字节:
使用
struct模块解析:
以下是针对你的数据编写的解析代码:import base64 import struct # 示例数据包(对应预期结果的Base64串) sample_b64 = b'DbMG_38MBgb8ru_RlDE1' # 解码URL安全无填充Base64 raw_bytes = base64.urlsafe_b64decode(sample_b64) # 按协议解析字段(大端字节序用!标识,小端则用<) length = raw_bytes[0] # 解析payload基础字段 src, dst, serial, dev_type, cmd = struct.unpack('!H H B B B', raw_bytes[1:9]) # 解析毫秒级时间戳 timestamp = struct.unpack('!Q', raw_bytes[9:17])[0] # 解析CRC8校验值 crc8 = raw_bytes[-1] # 组装成预期的Python对象 result = [ { "length": length, "payload": { "src": src, "dst": dst, "serial": serial, "dev_type": dev_type, "cmd": cmd, "cmd_body": { "timestamp": timestamp } }, "crc8": crc8 } ] print(result)
关键说明
- 字节序必须和你的设备通信协议一致,如果解析出的
src/dst等数值不符合预期,可切换大端!或小端<格式符。 - 你测试用的
DbMG_38BBgaI0Kv6kzGK解码后的字节串和预期结果不匹配,若要得到你给出的预期结构,需使用示例数据包DbMG_38MBgb8ru_RlDE1。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

