Neatbo.

按Schema解码Protobuf消息

使用独立proto2/proto3 Schema和明确消息类型检查二进制Protobuf,保留64位整数、字段存在性和未知wire记录。

浏览器本地处理输入Protobuf二进制 / .proto Schema输出检查JSON / CSV / 原始二进制单个文件最多 2 MiB · 最多 1 个
  1. 1添加输入
  2. 2调整设置
  3. 3获取结果

工具输入和文件在当前浏览器处理,不会上传。

输入内容

切换工具时在当前标签页临时保留输入。刷新或关闭后清除,较大的结果可能需要重新生成。

⌘ / Ctrl + Enter 运行

或将文件拖到这里

文件留在当前设备,原始文件不会被覆盖。

.bin · .pb · .protobuf · .dat

单个文件最多 2 MiB · 最多 1 个

    0 个字符 · 0 字节
    处理选项

    先填写标记为必填的选项,其余可保留默认值。

    正在准备处理工具…

    开始之前

    排查已有Schema的消息字节,不猜字段含义。解码报告区分最终值、显式字段存在性、默认值和wire出现记录,并保留原始二进制下载用于核对。

    如何使用

    1. 选择二进制文件,或选择hex/base64并粘贴字节编码。
    2. 粘贴确切的原始.proto,填写完整消息类型。
    3. 比较decoded、presence、oneof和unknown记录;下载检查报告及原始字节,并用接收端Schema复核。

    支持范围与限制

    一份二进制文件最多2 MiB,或最多6 MiB的hex/base64主文本;解析出的字节仍最多2 MiB。编码中只允许ASCII空格、制表与换行作为分隔,hex不接受0x前缀,base64必须标准字符、正确填充与规范padding bits。选中文件优先,零字节可用于合法空消息。

    第二输入区粘贴独立proto2/proto3 .proto,最多1 MiB、10000个反射描述JSON值/32层。明确提供完整消息路径,例如demo.Event;不猜类型、不fetch import。editions、service、extensions、声明group和features覆写明确不支持。具名路径/标识符最多4096字符;__proto__、constructor、prototype等保护片段拒绝,防止库改名或原型问题。

    先检查wire长度、tag、varint、UTF-8字符串及递归预算,再解码。wire遍历最多32层/20000条,包括容器与packed元素;最终解码JSON最多20000值/32层。重复singular message先合并,再递归检查最终required;oneof后值与map重复键按Protobuf规则处理。无效Schema、截断或最终required缺失原子失败。

    输出使用原始protobuf字段名,所有64位整数为十进制字符串,bytes为base64,enum为数值并另给名称/alias。float NaN、Infinity和负零使用明确字符串。默认值只报告,不填入缺席字段;proto3 implicit零值可能不出现在decoded中,但wire记录可显示曾传入。proto2显式bytes默认值及不安全/非有限数值Schema默认值明确不支持;proto3不得显式default。

    未知字段、已知字段的错误wire类型、proto2 closed enum未知值给出原始offset/长度/base64。packed closed enum记录包含原始整段packed字段,也可能含已知值;wire出现记录可能属于后来覆盖或丢弃的数据。检查JSON不是无损重编码,原始二进制完整保留。所有成功产物总计最多10 MiB,表格只预览前200字段,JSON/CSV完整。Schema只作数据,不执行用户脚本/服务或下载代码;受控库decoder仅在同源独立HTTP Worker运行,保持页面CSP。

    操作示例

    示例输入

    087b120161
    示例参数
    {"secondary":"syntax = \"proto3\";\npackage demo;\nmessage Event { int64 seq = 1; bytes payload = 2; }","params":{"messageType":"demo.Event","encoding":"hex"}}

    示例输出

    {
      "messageType": ".demo.Event",
      "decoded": {
        "seq": "123",
        "payload": "YQ=="
      },
      "presence": [
        {
          "path": "$.seq",
          "fieldNumber": 1,
          "fieldType": "int64",
          "presence": "implicit",
          "present": true,
          "entries": null,
          "declaredDefault": "0"
        },
        {
          "path": "$.payload",
          "fieldNumber": 2,
          "fieldType": "bytes",
          "presence": "implicit",
          "present": true,
          "entries": null,
          "declaredDefault": []
        }
      ],
      "oneofs": [],
      "enumValues": [],
      "enumDefinitions": {},
      "wireOccurrences": [
        {
          "path": "$",
          "offset": 0,
          "length": 2,
          "fieldNumber": 1,
          "wireType": 0,
          "fieldName": "seq",
          "status": "known"
        },
        {
          "path": "$",
          "offset": 2,
          "length": 3,
          "fieldNumber": 2,
          "wireType": 2,
          "fieldName": "payload",
          "status": "known"
        }
      ],
      "unknownFields": [],
      "policy": "Decoded inspection representation; defaults are reported, not injected. Wire sightings can refer to overwritten values. Original binary retained; no lossless re-encoding claim."
    }

    出现问题时

    确认Schema与完整消息类型、编码选项及原始字节;截断消息需从来源重新导出,不能猜补。修复缺失required或不支持的Schema范围,再运行示例确认恢复;错误不会给出部分产物。

    常见问题

    缺失字段会自动填默认值吗?

    不会。presence列与declaredDefault分别报告;decoded只保留最终实际值,proto3 implicit默认值按语义省略。

    为什么required要最后检查?

    同一个singular子消息可多次出现并合并;后段可能补齐前段缺少的required。工具对完成合并后的结果递归检查。

    未知字段能无损重新编码吗?

    检查JSON不提供该承诺。报告保存原始wire片段与完整original.bin,但不把规范化的decoded当作原始序列。

    文档与延伸阅读

    相关工具