Skip to content

Protobuf Decoder

Decode raw Protocol Buffer (protobuf) wire-format messages without needing a .proto schema. Paste base64 or hex-encoded bytes and inspect every field, wire type, and value - including nested messages.

Category: data
Use Case: gRPC Debugging, Reverse Engineering, API Inspection
Privacy: 100% browser-based

Decode Options

Recommended Settings

Pro Tips

  • No .proto schema is needed - the decoder reads the raw wire format directly, the same way `protoc --decode_raw` does
  • Varint fields (wire type 0) could be an int32, int64, bool, or enum - the field's meaning depends on your schema
  • Length-delimited fields (wire type 2) are tried as nested messages first, then as UTF-8 strings, then shown as raw bytes
  • Enable alternate interpretations to see a varint's zigzag-decoded value, or a fixed-width field's float/double reading
  • Field numbers repeated across multiple entries usually indicate a 'repeated' field in the original schema

Most Popular

Most users paste base64 data copied from a gRPC debugger or browser dev tools with nested message expansion on

When to Use This Tool

gRPC & API Debugging

Inspect the raw contents of a gRPC request or response captured from network traffic, without needing access to the service's .proto schema files.

Reverse Engineering

Understand the structure of protobuf-encoded data from a third-party API, mobile app, or binary file when the original schema isn't available.

Schema Verification

Confirm that data your service is producing matches the expected field numbers and types before finalizing or updating a .proto schema.

Learning Protobuf Internals

See exactly how Protocol Buffers encode values on the wire - varints, length-delimited fields, and fixed-width fields - for teaching or self-study.

How It Works

1

Decode the base64 or hex input into raw bytes

2

Read each field's tag as a varint, splitting it into a field number and wire type

3

Based on the wire type, read a varint, 8 fixed bytes, a length-delimited byte range, or 4 fixed bytes

4

For length-delimited fields, recursively attempt to parse the bytes as a nested protobuf message, falling back to a UTF-8 string or raw hex if that fails

5

Render every field as an indented tree showing its field number, wire type, and decoded value, with alternate numeric interpretations available

100% Private

Files never leave your device. All processing happens locally in your browser.

Lightning Fast

Powered by Pure JavaScript (protobuf wire format parser) for optimal performance on modern browsers.

Secure

No data collection, no tracking, no sign-up required.

Frequently Asked Questions

Do I need the .proto schema to use this tool?

No. This tool decodes the raw protobuf wire format directly, the same way the `protoc --decode_raw` command does. It shows field numbers and wire types without knowing the original field names or exact types, since that information isn't stored in the encoded bytes.

Why does a field show as both a number and other interpretations?

The protobuf wire format only stores a wire type (varint, 64-bit, length-delimited, or 32-bit), not the exact field type from the schema. A varint could be an int32, int64, bool, or enum, and a 32-bit or 64-bit value could be a fixed-width integer or a float/double - the alternate interpretations let you check which reading makes sense for your data.

How are nested messages detected?

For every length-delimited field, the decoder attempts to parse its bytes as a complete embedded protobuf message. If that succeeds and produces at least one valid field, it's shown as a nested message; otherwise the tool falls back to showing it as a UTF-8 string (if valid) or raw bytes.

Can nested-message detection give a false positive?

Occasionally. Some byte sequences - especially short ones - can coincidentally look like a valid nested message. If the nested breakdown doesn't make sense, disable 'Auto-expand nested messages' to see the field as a plain string or hex byte dump instead.

What input formats are supported?

Paste base64-encoded data (common when copying protobuf payloads from browser dev tools or gRPC debuggers) or hex-encoded data, or upload a raw binary file directly - it's automatically converted to hex.