ProtoDecodeX 是一个跑在浏览器里的 Protobuf 线格式解码工具。
它主要是拿来处理那些不太舒服的场景:手里只有一段原始字节,也许没有 .proto,也许只有日志里的十六进制、代理里拷出来的 payload,或者一串看起来不太友好的 Java 字节数组,但你还是得先搞清楚里面到底装了什么。
这个工具想解决的是一些很具体的问题:
- 这段 Protobuf 二进制里到底有哪些字段?
- 这份输入是十六进制、Base64、Java 字节数组,还是 Java 转义字符串?
- 这是不是一段 varint 长度分隔的多消息流?
- 我能不能贴一点
.proto片段,把字段号映射成字段名? - 某个 bytes 字段是不是被 XOR 过,能不能继续往下解?
它不是那种大而全的 Protobuf 工具,更像一个顺手、直接、够用的检查台。你可以粘贴原始数据、上传本地文件、看字段结构、字节范围和原始 bytes,需要的时候再补一小段 schema,让结果更好读一点。
- 逆向分析未知 Protobuf 消息
- 检查从日志、抓包或代理里拿到的二进制载荷
- 检查 gRPC 消息体
- 处理 Java 代码或日志中的字节数组/转义字符串
- 分析嵌套 bytes 字段,一层层往下定位真实结构
很多 Protobuf 工具默认你已经知道 schema。可真实排查问题的时候,经常不是这样。
你手上可能只有:
- 日志里的一段 hex
- API trace 里的 Base64
- Java 打印出来的一串字节
- 带着 gRPC framing 的消息体
ProtoDecodeX 就是从这种原始条件出发。先把线格式看清楚,再一点点补上下文,而不是一开始就假设环境完整。
- 支持 Hex、Base64、Java 十进制字节数组、Java 转义字符串、文件上传
- 自动识别输入格式,并规范化成可读的 Hex
- 以表格形式展示 Protobuf 线格式解析结果
- 支持 varint 长度分隔的多消息流解析
- 检测到 gRPC 帧头时会尝试跳过
- 支持粘贴 message 定义,做 schema 感知展示
- 内置 Smart Decode,支持条件 XOR 和手动 XOR
- XOR 后的结果可以直接作为新的主输入继续分析
- 常用状态会保存到
localStorage - 仓库里也带了测试、CI、Docker 和部署配置
| 格式 | 示例 |
|---|---|
| 十六进制字节流 | 08 96 01 |
| Base64 | CJYB |
| Java 十进制字节数组 | 8, 150, 1 |
| Java 转义字符串 | \010\226\001 |
| 本地文件上传 | 浏览器中读取任意本地二进制文件 |
- 建议使用 Node.js 20,和 CI 保持一致
- npm
npm install
npm start启动后访问 http://localhost:3000。
npm run build构建产物会输出到 build/。
npm test- 粘贴原始数据,或上传本地文件。
- 工具自动识别输入格式,并生成规范化 Hex。
- 点击
Decode开始解析。 - 在结果表格中查看字段号、Wire Type、字节范围与原始值。
- 如有需要,继续使用高级功能中的 Schema 展示或 Smart Decode。
解码结果会把这些最有用的信息直接摊开:
- 字段号
- Wire Type
- 字节范围
- 原始 bytes
- 可展开的大字段内容
就算没有 .proto 文件,也能先把消息的大致轮廓看出来。
不管输入原来是什么格式,最后都会统一成一个只读的 Hex 视图。这个设计其实很朴素,但很好用,尤其是当你要对照日志、复制片段、或者继续手工分析的时候。
如果输入里串着多条 Protobuf 消息,而且每条前面都有 varint 长度前缀,可以勾选 parse varint length delimited input,让它按消息边界拆开显示。
这种情况在流式传输、批量消息和一些协议封装里挺常见的。
如果输入看起来带着 gRPC 帧头,解码器会先试着把那层头部跳过去,再继续做 Protobuf 解析。省掉一点小但烦人的手工处理。
在高级面板里,你可以直接贴一小段 message 定义,把字段号映射成字段名和类型。
示例:
message User {
string name = 1;
uint32 age = 2;
repeated string tags = 3;
}补上 schema 之后,界面能多给你一些上下文:
- 字段名
- 基础类型感知渲染,例如
string、bool、float、double optional/repeated等提示
这个 parser 是轻量实现,适合快速辅助阅读,不打算替代完整的 .proto 编译。
有些业务载荷会把真正有用的内容塞在一个 bytes 字段里,再顺手做一层 XOR。Smart Decode 就是拿来处理这种情况的,支持两种方式:
- 条件 XOR:以一个字段的值作为 XOR key,对另一个字段做解码,并可设置前置条件
- 手动 XOR:手动输入数据和 XOR 值,快速验证结果
如果 XOR 后的结果本身还是一段有效的 Protobuf,可以直接把它切回主解码输入,继续往下看。
ProtoDecodeX 是本地优先的:
- 解码逻辑在浏览器内执行
- 不依赖远程解码接口
- 本地文件由浏览器读取,不需要上传到服务端
为了省得你每次重新贴数据,应用会把一部分状态写到 localStorage,包括:
- 输入文本
- 检测到的输入格式
parseDelimited开关状态- 粘贴的 schema 内容
- 当前选择的 message
- 是否已有解码结果
如果你在共享设备或敏感场景中使用,建议在结束后清空状态,或使用隐私窗口。
ProtoDecodeX 更偏排查和分析,不是完整的 protoc 替代品。
- 重点是 wire-format 解码,而不是完整的
.proto编译与语义校验 - Schema 解析器是轻量实现,只支持部分
.proto语法 packed repeated的识别基于启发式逻辑- 对损坏或不完整数据,可能只解析出部分结果,并留下
leftOver字节 - 当前没有内置文件导出或 URL 分享能力
- 不提供后端存储、团队协作或远程会话能力
| 命令 | 说明 |
|---|---|
npm start |
启动 Vite 开发服务器,端口为 3000 |
npm run build |
生成生产构建,输出到 build/ |
npm test |
使用 Vitest 运行测试 |
npm run test:watch |
以 watch/UI 模式运行测试 |
仓库中还提供了辅助脚本:
scripts/local-build.shscripts/docker-build.sh
仓库里已经带了这些东西:
- 多阶段
Dockerfile docker-compose.ymlnginx.conf
拿来做容器化开发和部署都比较顺手。
docker compose --profile dev up --build protobuf-decoder-devdocker compose --profile prod up --build protobuf-decoder-prod- React 18
- Vite 5
- Semantic UI React
bufferjsbi- Vitest
- Testing Library
- jsdom
欢迎提 Issue 和 Pull Request。这个项目里更有价值的改动,通常也都比较具体:
- 提升解码正确性
- 扩展 schema 解析覆盖范围
- 增强类型感知展示能力
- 优化大数据量场景下的交互体验
- 补充真实案例和文档
提交 PR 前,建议先执行:
npm test
npm run buildMIT
