Paste MessagePack hex or base64 — JSON appears on the right automaticallyMessagePack hex / base64

What is MessagePack to JSON?

Your gRPC sidecar logs the request body as a long hex string and you need to actually read what is in it. Or Redis returned a value that the previous service stored as msgpack and your terminal is showing \x82\xa7orderId\xa8ORD-7421. MessagePack is a compact binary format — great on the wire, unreadable in a log line. This page takes the hex or base64 dump and gives you the JSON it represents.

Decoding follows the official MessagePack wire-format spec via the @msgpack/msgpack JavaScript library. Maps become objects, arrays become arrays, ints and floats decode straight into JSON numbers, and the result is pretty-printed against RFC 8259. Hex with 0x prefixes, \x escapes, spaces, or commas all parse fine — and if your input is base64 (per RFC 4648) we detect that automatically.

No upload, no backend, no logging. The decode runs in your browser as a plain <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array" target="_blank" rel="noopener">Uint8Array</a> — close the tab and the bytes are gone.

How to Use MessagePack to JSON

Paste, read, copy. There is no Convert button — the right pane updates as you type, with a 300 ms debounce so it does not thrash on every keystroke.

1

Paste the Hex or Base64

Drop the MessagePack bytes into the left editor. Anything goes — raw hex (82a7...), spaced hex (82 a7 6f), \x-escaped Python byte literals, or a base64 blob. Hit Sample to load an order-tracking payload that decodes to a real object.

82a76f72646572496441 4f52442d3734323120a574 6f74616c cb4056600000000000

That snippet is part of an Order payload — orderId, total, items, customer. After decoding you get back the whole structure as JSON.

2

Read the JSON on the Right

The right pane re-decodes on every change. If the bytes are valid MessagePack you see the object. If they are truncated, padded with garbage, or actually a different format (CBOR, BSON), the pane shows the parser error message — usually enough to tell you where the input is wrong.

3

Copy What You Need

Hit the Copy button on the output side to grab the JSON. Drop it into a unit test fixture, paste it into a bug ticket, or feed it into our JSON Formatter if you want it pretty-printed differently. To go the other direction (object → msgpack), use JSON to MessagePack.

When You'd Actually Use This

Read a gRPC or Sidecar Log Body

A service-mesh sidecar dumps request bodies as hex. The body is msgpack because that is what the upstream service serializes with. Paste the hex, see the object, find out the call had orderId: "ORD-7421" and total: 89.50 instead of guessing.

Inspect a Redis Value

You stored an object in Redis with a msgpack codec to save space. Now you want to know what is in session:42 without writing a script. Run GET, copy the value (most clients show it as hex or base64), paste it here.

Decode a Cap-N'-Stash Cache Entry

Caches that target small payloads — MessagePack, FlatBuffers, sometimes raw protobuf — are everywhere now. When the cached blob is msgpack and you need to compare it against the live JSON, this is the fastest path to apples-to-apples.

Sanity-Check What a Client Is Sending

You wrote a mobile client that encodes the request body with msgpack to save bandwidth. You hit a regression. Capture the actual bytes (Charles, mitmproxy, network tab), paste, and confirm the field names and values match the schema your server expects. Customer name Ava Chen, items SKU-101 × 2 — yes or no.

Common Questions

Are my bytes uploaded anywhere?

No. The decode is pure JavaScript in your browser — the @msgpack/msgpack library reads your input as a Uint8Array, walks the wire format, and renders the resulting object as JSON. There is no fetch, no analytics on the input, nothing leaves the tab. Treat it the same as any local CLI tool.

Hex or base64 — does it matter which I paste?

Either works. The tool tries hex first (because hex with 0x or \x prefixes, spaces, or commas is the most common log shape), and falls back to base64 if the input is not valid hex. If you have a Python b'\x82\xa7order' byte literal, that decodes too — the wrapping b'...' is stripped and the escapes are expanded.

Why does my output show timestamps as something weird?

MessagePack has a built-in timestamp extension type that the library decodes to a JS Date. When stringified into JSON that becomes an ISO 8601 string. If you see a string like "2026-05-05T12:34:56.000Z" in the output, that is a real timestamp the encoder embedded — not a bug.

What if the input is partially valid?

The decoder reads the wire format byte-by-byte. If a length prefix says "next is a 16-byte string" and there are only 8 bytes left, it throws a parse error. The error message in the right pane usually tells you which type token failed and roughly where — that is normally enough to spot a truncated paste or a stray byte.

Can it handle binary blobs (the bin family)?

Yes. bin 8/bin 16/bin 32 values come back as Uint8Array instances. JSON has no native bytes type, so they render as {"0":1,"1":2,...} when stringified. If you specifically need base64 for the bin fields, decode here first and then transform with our JSON to Base64 tool.

How does this compare to protobuf or CBOR?

MessagePack is schemaless (the keys live in the bytes), CBOR is similar but has more types and a different encoding, and protobuf needs a .proto schema to decode at all. If your bytes are protobuf, this tool will fail — try our Protobuf to JSON page instead. If they are CBOR, the wire format is close but not the same, so you would need a CBOR-specific decoder.

Other MessagePack Tools

MessagePack tools that pair well with this one — go the other direction, validate, or just look at the bytes: