Protobuf Decoder Online
Decode a Protocol Buffers binary message without the .proto schema, in your browser. Your bytes stay on your device.
Your protobuf bytes are decoded locally in your browser and never uploaded, but avoid pasting messages that contain real secrets or personal data into any tool.
Need to decode a JWT instead? Try the JWT Decoder.
About Protobuf Decoder
This protobuf decoder reads a Protocol Buffers binary message straight from its bytes, with no .proto file required. Paste the payload as hex or base64 and the decoder walks the raw wire format: it reads each tag to recover the field number and wire type, then interprets the value. Varints are shown as int64, uint64, and zig-zag readings; fixed64 and fixed32 fields expose their integer, double, and float views; and length-delimited fields are tried as nested messages first, then as UTF-8 text, then as raw hex bytes. The result is rendered as an indented field tree, with repeated fields grouped under the same number. It is built for engineers debugging gRPC traffic, captured packets, or opaque proto blobs from logs. Everything runs in your browser, so the bytes you paste are decoded locally and never leave your device.
Features
- Decodes any Protocol Buffers message from raw bytes without needing the .proto schema
- Accepts hex or base64 input with auto-detection and a manual format toggle
- Reads varint, fixed64, length-delimited, and fixed32 wire types from the tag
- Shows varints as int64, uint64, signed zig-zag, and boolean interpretations
- Renders fixed64/fixed32 fields as integer, double, and float views plus raw bytes
- Recursively decodes nested messages and falls back to UTF-8 strings or hex bytes
- Groups repeated fields under the same field number in an indented tree
- Reports a clear error for truncated, malformed, or non-protobuf input
How to use the Protobuf Decoder
- Copy your protobuf payload as a hex string or base64.
- Paste it into the Protobuf message box.
- Leave the format on Auto, or pick Hex or Base64 if detection is wrong.
- Read the decoded field tree, expanding nested messages to inspect values.
Example
Input
08 96 01 12 07 74 65 73 74 69 6e 67
Output
#1 varint wire 0 150
#2 string wire 2 "testing"
Field 1 is a varint (150) and field 2 is a length-delimited UTF-8 string.
Common errors & troubleshooting
- The decoder shows "Input is not valid hex" or "Input is not valid base64". — Switch the format toggle to match your data, or strip stray characters; hex must be pairs of 0-9a-f and base64 must use the standard or URL-safe alphabet.
- A field that should be a string is rendered as a nested message or raw hex. — Without the .proto file the decoder guesses from the bytes; length-delimited fields are ambiguous, so a sub-message that happens to look like text, or vice versa, can be misread.
- Decoding fails with "Length-delimited field runs past the end of the input". — The payload is truncated or not actually protobuf. Re-capture the full message and confirm you copied every byte, including trailing ones.
- Group wire types report as unsupported. — Wire types 3 and 4 (start-group/end-group) are deprecated in protobuf and rarely emitted; re-encode the message with proto2/proto3 fields instead of groups.
Frequently asked questions
- Can I decode protobuf without the .proto file?
- Yes. This protobuf decoder reads the raw wire format, so it recovers every field number, wire type, and value directly from the bytes. Without the schema it cannot know the original field names or whether a number was meant as a signed, unsigned, or enum value, so it shows the plausible interpretations side by side.
- What do the protobuf wire types mean?
- Each field tag encodes a wire type: 0 is a varint (ints, bools, enums), 1 is fixed64 (sfixed64, double), 2 is length-delimited (strings, bytes, and nested messages), and 5 is fixed32 (sfixed32, float). The decoder labels each field with its wire type so you can map it back to the source definition.
- Should I paste protobuf as hex or base64?
- Either works. Leave the toggle on Auto and the tool detects the format; clean hex (pairs of hex digits, with optional spaces, colons, or 0x prefixes) is read as hex and everything else is treated as base64, including URL-safe base64. Switch the toggle manually if your data is ambiguous.
- Why is a varint shown as several different numbers?
- A protobuf varint can represent an int64, a uint64, or a zig-zag-encoded sint64, and the wire format does not record which. The decoder prints all of them, plus a boolean reading for 0 and 1, so you can pick the interpretation that matches your schema.
- Does the decoded payload get uploaded anywhere?
- No. The protobuf decoding runs entirely in your browser using a pure JavaScript wire-format parser, so the bytes you paste are processed on your device and never sent to a server.
Related tools
All ArrayKit tools