Boneyard Tools

Online Protobuf Wire Decoder (No Schema)

Drop in a binary protobuf payload to decode it field by field without a .proto schema. The decoder reads the raw wire format and shows each field number, its wire type (Varint, I64, Len, or I32), and the decoded value. Because length-delimited fields are ambiguous without a schema, it shows both a likely UTF-8 string and a nested-message attempt for each one. The file is parsed entirely in your browser and is never uploaded.

How to decode a protobuf message

  1. Drag a binary protobuf file onto the box, or click browse to pick one.
  2. Read the table: each row is one field with its number, wire type, and decoded value.
  3. For length-delimited fields, toggle between the string, hex, and nested-message views to find the right reading.

Examples

The canonical varint example

Bytes 08 96 01
Field 1, Varint, value 150

A string field

Bytes 12 05 68 65 6c 6c 6f
Field 2, Len, string "hello"

Frequently asked questions

Is my file uploaded anywhere?

No. The file is read and decoded entirely in your browser using JavaScript. Nothing is uploaded, runs in your browser, so even sensitive or proprietary payloads stay on your device.

Do I need the .proto schema?

No. This decoder reads the raw wire format, which encodes a field number and a wire type for every field. It recovers the structure and values without a schema. The trade-off is that field names and exact types are not in the bytes, so it shows best-effort interpretations instead.

Why does one field show several interpretations?

Without a schema some wire types are ambiguous. A length-delimited field could be a string, packed bytes, or a nested message, so the tool shows the UTF-8 text, the raw hex, and a nested-message attempt. A varint could be an int, a boolean, or a zigzag-encoded signed value, so all three readings are shown.

What are the wire types?

Protobuf uses four main wire types: 0 Varint (base-128 integers, booleans, and enums), 1 I64 (eight fixed bytes for fixed64 or double), 2 Len (a length then that many payload bytes for strings, bytes, and sub-messages), and 5 I32 (four fixed bytes for fixed32 or float).

What happens with a truncated or invalid payload?

The decoder reports an error rather than guessing. A varint that never ends, a fixed field with too few bytes, or a length-delimited field that claims more bytes than exist will all be flagged as malformed input.

What is zigzag decoding?

ZigZag is how protobuf stores signed integers (sint32 and sint64) so that small negative numbers stay small on the wire. The tool shows the zigzag-decoded signed value next to the plain unsigned reading for every varint.

Related tools