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

Python:URL编码无填充Base64解码为JSON失败求助

问题解决:二进制协议数据解析而非JSON解析

你之前的核心错误是将二进制协议数据误当作JSON文本解析——解码后的字节串并非UTF-8/ASCII编码的JSON内容,而是按照自定义二进制协议打包的结构化数据,必须按协议规定的字段长度、字节序(大端/小端)来解析每个字段。

具体解决步骤

  1. 明确数据结构:根据你的预期结果,反推协议的二进制结构(需和实际通信协议一致):

    • 第1字节:length(无符号整数)
    • 后续13字节:payload,包含:
      • 2字节:src(无符号短整数)
      • 2字节:dst(无符号短整数)
      • 1字节:serial(无符号字节)
      • 1字节:dev_type(无符号字节)
      • 1字节:cmd(无符号字节)
      • 8字节:timestamp(毫秒级时间戳,64位整数)
    • 最后1字节:crc8(无符号字节)
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:57:02