Choose the byte format explicitly
Hex is the default and accepts spaces, colons and 0x prefixes. Switch to Base64 if that is what your capture contains; short strings can be valid in more than one encoding.
Protocol bytes, explained
Paste a raw message, then add a self-contained .proto only when you need declared names and types.
Bytes and schema are processed in this browser, without upload.
Enter a wire message or varint.
A Protobuf decoder is useful when a log contains bytes but no readable field names. The wire stream still tells you where every field starts, how it is encoded, and exactly which bytes belong to it.
A protobuf wire decoder cannot infer whether a length-delimited value was a string, nested message or packed data. Compare tentative readings against the raw hex, or supply a schema before treating any value as typed.
Keep the evidence beside each interpretation.
This Protobuf decoder shows field number, wire type, half-open byte offsets and the original hex together. A malformed length points to its first impossible byte instead of leaving you with an unexplained empty result.
Paste a single .proto and choose a message to get typed JSON. The named result sits beside the same raw fields, so you can check where a declared string or integer came from.
Hex is the default and accepts spaces, colons and 0x prefixes. Switch to Base64 if that is what your capture contains; short strings can be valid in more than one encoding.
Wire type 0 carries unsigned bits that might represent signed integers, ZigZag values, booleans or enums. Wire type 2 can hold text, bytes, packed numbers or another message. Only a schema settles the intended type.
Automatic decoding waits 350 ms after an edit. Turn it off for Ctrl/Cmd + Enter. Any input or option change disables export until the new run finishes; offsets start at zero and the end excludes the next byte.
The Protobuf decoder reads varint, fixed64, length-delimited and fixed32 records. It rejects truncated keys, impossible lengths and deprecated group tags instead of silently skipping unknown spans.
Use the protobuf varint decoder to read up to ten bytes as exact uint64 and optional sint64 ZigZag. Reverse direction to encode a decimal value; BigInt avoids JavaScript Number precision loss.
A self-contained .proto can name fields and decode repeated or nested values with protobuf.js. Select the root message when the file defines several; the raw wire tree remains visible if schema interpretation fails.
The protobuf hex decoder exports normalized uppercase hex of the original payload. It never re-encodes a guessed message, so byte comparisons against the capture remain meaningful.
Yes, for wire structure. You can see field numbers, wire types, offsets and raw values. Declared names and exact types require a matching .proto.
Choose Hex, paste pairs of digits, and inspect the numbered fields. An odd digit or truncated field produces an error rather than a partial success.
The wire format stores only a small type code. The same bytes may legitimately be an unsigned integer, ZigZag integer, string, bytes or embedded message.
protoc --decode_raw can inspect unknown wire data; protoc --decode needs a compiled message type. This browser tool offers a similar raw view and optional local schema.
A varint starts after a wire-0 field tag and ends at the first byte whose top bit is clear. The standalone Varint mode accepts that byte sequence directly.
Found a definition that should be supported?
Return to the Protobuf decoder when a captured message needs a byte-for-byte explanation. Keep the original hex and the declared schema together for the final review.