按Schema解码Protobuf消息
使用独立proto2/proto3 Schema和明确消息类型检查二进制Protobuf,保留64位整数、字段存在性和未知wire记录。
- 1添加输入
- 2调整设置
- 3获取结果
工具输入和文件在当前浏览器处理,不会上传。
开始之前
排查已有Schema的消息字节,不猜字段含义。解码报告区分最终值、显式字段存在性、默认值和wire出现记录,并保留原始二进制下载用于核对。
如何使用
- 选择二进制文件,或选择hex/base64并粘贴字节编码。
- 粘贴确切的原始.proto,填写完整消息类型。
- 比较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当作原始序列。