本文へスキップ
AZ Tools

MessagePack デコーダ

MessagePack は、JSON では大きすぎ protobuf では手続きが重すぎるときに選ばれる形式です。同じ値をバイト列に詰め込みます。ところが不具合が起きると、その小ささがそのまま障害になります。キャッシュやキュー、ログから出てきたペイロードは復号しなければ読めないからです。 このツールは形式全体を読み、JSON なら失われる区別を保ちます。整数は書かれた幅のまま返り、JavaScript の数値に収まらない 64 ビット値は黙って丸めず文字列として保ちます。バイナリはテキストに潰されずバイナリのまま残ります。str と bin の区別は形式の公開後に追加されたもので、両者を混同することこそ復号器がデータを壊す典型です。拡張型は番号とともに示し、タイムスタンプ拡張は三つの符号化すべてを正しく解読します。 結果は値ごとの型を添えたツリーと、JSON として表示します。JSON で表せないものは潰さず明示します。入力に値ひとつ分より多いバイトがあれば——連結されたメッセージ列はそう見えます——残りが何バイトかを伝えます。無いことにはしません。アップロードはされません。

base64 か hex の MessagePack ペイロードを貼り付けると復号します。

使い方

  1. ペイロードを base64 か hex で貼り付けます。形式は自動判定され、指定もできます。
  2. ツリーを読みます。各行にキー、MessagePack の型、値が並びます。
  3. 値を他所で処理するなら JSON をコピーします。
  4. 取得したペイロードのファイルをドロップすればそのまま復号できます。
  5. 複数メッセージの列なら、残りバイト数の注記を確認します。

よくある質問

str と bin の違いは何ですか
MessagePack には元々テキストにもバイトにも使う raw 型ひとつしかありませんでした。2013 年の改訂で UTF-8 テキスト用の str と任意バイト用の bin に分かれました。そうしないと復号器はバイト列をテキストとして解釈すべきか判断できないからです。bin を文字列として扱うことがバイナリデータの破損経路なので、ここでは両者を分けています。
大きな整数が JSON で文字列になるのはなぜですか
JavaScript の数値が整数を正確に保てるのは 2^53 までです。MessagePack は完全な 64 ビット整数を扱うため、その上限を超える値は JSON 出力で文字列にします。桁が黙って消えるほうが不便さより悪いからです。
タイムスタンプはどう解読しますか
型 -1 のタイムスタンプ拡張には三つの符号化があります。4 バイトの秒、12 バイトのナノ秒と秒、そして 30 ビットのナノ秒を 34 ビットの秒の上に一語へ詰めた 8 バイト形式です。最後が落とし穴で、普通の整数として読むと数万年ずれた日付になります。
残りバイトの警告は何を意味しますか
MessagePack の値は自己完結しているため、ひとつのバッファに複数が並べられます。最初の値が入力より先に終われば、残りはたいてい別のメッセージです。黙って無視せず、どれだけ残っているかを示します。
タイムスタンプ以外の拡張型は
型番号と base64 のペイロードで示します。拡張の意味はそれを書いたアプリケーションが決めるので、汎用に復号できる対象がありません。
ペイロードはアップロードされますか
いいえ。バイト列はブラウザ内で復号され、サーバーには送信されません。

関連ツール