Why it matters
Binary formats are compact and fast, and opaque when something goes wrong. A gRPC call returns bytes, a queue holds a MessagePack blob, a WebAuthn response is CBOR, and the only question is what's inside. Protobuf is the hardest: its wire format carries field numbers and four wire types, not names or real types.
This decoder reads each format byte by byte and shows every field with its offset. For protobuf without a schema it lists every plausible reading, and with a .proto it names each field and produces proto3 JSON. It was checked against the reference implementations, protoc, the Python protobuf library, cbor2 and msgpack, on several hundred random messages with no differences.
How to use it
- Paste the bytes as hex or base64.
- Leave the format on Detect, or choose it.
- For protobuf, paste the .proto and pick the message type to get names.
- Read the table, or copy the JSON.
FAQ
Can you decode protobuf without the .proto file?
Yes, the structure: field numbers, wire types and values. Names and exact types aren't in the bytes, so the decoder shows every possible reading.
Why does a field show as both a string and a message?
In the wire format both are length-delimited bytes. If the bytes also parse as valid fields, either reading is possible; the .proto settles it.
What is CBOR?
Concise Binary Object Representation (RFC 8949), a binary JSON-like format used in WebAuthn, COSE, IoT protocols and CWT tokens.
What is sint and zigzag encoding?
Protobuf's sint32 and sint64 map signed numbers to unsigned ones (0, -1, 1, -2 become 0, 1, 2, 3) so small negatives stay short. Plain int32 makes every negative number 10 bytes long.