Protobuf decoder
Paste or drop your data here, or open a file.
New to Bracely?
Everything stays in your browser.
Output appears here
Paste or open your data in the input box. It never leaves your browser.
Protobuf Decoder (no .proto needed)
Paste protobuf bytes as hex or Base64, or drop a .pb file, and see every field by number: strings, numbers, nested messages and repeated fields. Without the schema some fields are ambiguous, so a table lists each way a field can be read, such as int or zigzag sint, double or integer, text or message.
Example: an order, without its .proto
An order message as Base64. Field 3 is a nested customer, field 4 a double (4248.5) shown in hex as protoc shows it, field 8 a packed list, and field 9 is repeated:
Base64
CglPUkQtMjA0MTkQAxoQCghKb2huIERvZRIEUHVuZSEAAAAAgJiwQCgBMAM9AADAP0IEAQKsAkoIcHJpb3JpdHlKBGdpZnQ=Output
1: "ORD-20419"
2: 3
3 {
1: "John Doe"
2: "Pune"
}
4: 0x40b0988000000000
5: 1
6: 3
7: 0x3fc00000
8: "\001\002\254\002"
9: "priority"
9: "gift"
How do I use the Protobuf decoder?
- Paste hex or Base64, or drop a .pb or .bin file.
- Read the fields, like protoc --decode_raw, or as JSON by field number.
- Show: every field, every reading to tell an int from a sint or a double.
What does the Protobuf decoder do?
- Same text as protoc --decode_raw
- gRPC and gRPC-web frames unwrapped, gzip too
- Every reading of each field
When to use the Protobuf decoder
Protocol Buffers encode each field as a number, a wire type and a value. The wire type says how to read the bytes (a varint, 4 or 8 fixed bytes, or a length followed by that many bytes), but not what they mean: a varint may be an int, an enum, a bool or a zigzag-encoded sint, 8 fixed bytes may be a double or a 64-bit integer, and a length-delimited value may be text, raw bytes, a nested message or a packed list of numbers.
So a decoder without the .proto shows the structure and leaves the types open. The text view follows protoc --decode_raw: varints as unsigned numbers, fixed values in hex, nested messages in braces. Bracely shows text in any language as characters rather than octal escapes, and the field table gives every reading, so you can see that 4248.5 is a double or that 3 as a sint is -2.
gRPC puts a 5-byte header (a compressed flag and a length) before each message; Bracely detects it, unwraps one or more frames, unpacks gzip-compressed ones and shows a gRPC-web trailer such as grpc-status.
Frequently asked questions
- Why does a string sometimes show as a message?
- Some short byte sequences are both readable text and a valid message. Bracely shows readable text as a string, where protoc --decode_raw prefers the message; the field table shows both.
- Where do I get the bytes?
- From a network capture or the browser's Network panel (copy the response as Base64 or hex), from a log, from a queue message, or from a .pb file saved by your code.
- Do I need the .proto file?
- No. Protobuf bytes carry field numbers and wire types, which is enough to show the structure. Field names and exact types come from the .proto, so you see numbers instead of names, and the field table shows the possible types.
- Is my data uploaded?
- No. Bracely runs entirely in your browser, so nothing you paste or open leaves your device.
More JSON tools
Bracely has 108 JSON tools in one page. Related ones:
- JWT Decoder
- JSON Escape
- Base64 to JSON
- Certificate decoder
- Unescape JSON
- URL encode / decode
- HTML entity encoder
- GZIP decompress
- Escape text for JSON
- Slug generator
- QR code generator
- Webhook signature
- JSON to Base64
- JSON anonymizer
- Encrypt JSON fields
- Postman collection runner
- OpenAPI response validator
- JSON Formatter
- JSON Validator
- JSON Viewer
- JSON Repair
- JSON Diff
- JSON to YAML
- JSON to CSV
- jq Playground
Runs entirely in your browser. Nothing you paste is uploaded. Made by Saurabh Pagrut · About · Privacy policy
Last updated · Version 6.3 · Changelog
Saurabh Pagrut on GitHub · LinkedIn · X · YouTube · Instagram