ToolConvoyToolConvoyv2.6
DEV

MsgPack インスペクター — MessagePack バイナリのデコードとエンコード

MessagePack バイナリを hex ビュー付きでデコード・エンコードします。パックされたデータ構造をバイト単位で検査 —— ブラウザで動作、アップロード不要。

● ローカル動作 · タブ内で生成ページ読み込み以降のツールによる通信:0件
DEV

MsgPack Inspector

Decode .msgpack to JSON, encode JSON to MsgPack, view hex + decoded side-by-side. Runs locally.

● ローカル動作 · タブ内で生成ページ読み込み以降のツールによる通信:0件

Drop a .msgpack file

Or encode JSON → MsgPack
広告
広告

MessagePack は、現代の Web の多くの内部処理を支えているバイナリシリアライズ形式です。Redis は Lua スクリプトの返値にこれを使用し、Fluentd はログレコードを集約先に転送する前に MessagePack でシリアライズします。Nginx の upstream モジュールはバックエンドサービスと MessagePack でやり取りでき、ゲームエンジンもネットワークパケットに利用しています。毎秒 60 回も更新を送るような場面では 1 バイトがものを言うからです。この形式はコンパクトでパースが高速、50 以上の言語でサポートされています —— ただし MessagePack バイナリは hex エディタで人間が見ても意味が分かりません。インスペクターは、バイトをバイト単位の注釈付きのナビゲーション可能な JSON ツリーへデコードすることで、そのギャップを埋めます。

この形式が巧いのは、先頭バイト(prefix byte)システムにあります。各値の先頭 1 バイトがデコーダーに対して次に来るものを伝えます。0x00〜0x7f は正の整数、0xa0〜0xbf は短い文字列(残 bits で長さをエンコード)、0x80〜0x8f は小さな map、0x90〜0x9f は小さな配列を意味します。つまり、現実世界の MessagePack データの多くは、先読みもバックトラックもスキーマのためのメモリ確保も不要に、1 パスでデコードできます。インスペクターは hex パネル上でこれらの先頭バイトをハイライトするため、形式を直接「読む」ことができます。

MessagePack を使うサービスをデバッグする際には、インスペクターのラウンドトリップ機能が重要になります。ネットワークタブからバイナリレスポンスをキャプチャし、デコードしてサーバーが実際に返した内容を確認し、怪しいフィールドを編集して再エンコードすれば、修正後のバイナリがどう見えるかを確認できます。hex パネルには元のバイトと再エンコード後のバイトが並んで表示され、変更されたバイトはハイライトされます。これはテキスト形式では無償で得られるものの、バイナリ形式では自前で作り込まなければならないデバッグループです。

広告

使い方

  1. hex を貼り付けるかバイナリファイルをドロップ

    hex 文字列を貼り付けるか、.msgpack バイナリファイルを入力欄にドラッグしてください。ツールは MessagePack バイトを読みやすい JSON ツリーへデコードし、各要素の生の hex を並べて表示します。

  2. バイト単位のビューを確認

    デコード後のツリー内の任意の値をクリックすると、hex パネルで対応するバイトがハイライトされます。整数は fixint/uint/int のフォーマットバイトを、文字列は長さプレフィクスを、map はペア数を表示します。

  3. MessagePack へ再エンコード

    JSON ツリーを編集して encode を押すと、新しい MessagePack バイナリが生成されます。出力は hex とダウンロード可能な .msgpack ファイルの両方で表示されます。ラウンドトリップ検証により、エンコードがロスレスであることが確認されます。

よくある質問

なぜ JSON ではなく MessagePack を使うのか?

MessagePack はバイナリシリアライズ形式で、同等の JSON と比較して一般的にペイロードを 30〜50% 小さくできます。Redis、Fluentd、Nginx、ゲームネットワーキングスタックなどで利用されています。トレードオフは人間にとっての可読性です。MessagePack バイナリはテキストエディタでは読めないため、インスペクターが必要になります。

整数の扱いは JSON と比べてどう違うのか?

MessagePack は可変長エンコードを採用しています。0〜127 の整数は 1 バイト(positive fixint)に収き、255 までの整数は 2 バイト(uint 8)を使い、さらに大きな整数はより多くのバイトを使用します。JSON は常に整数を 10 進文字列として格納します。インスペクターはすべての整数値の正確なバイト長を表示します。

部分的または途中で切れた MessagePack ストリームをデコードできるか?

ツールはストリーム内の最初の完全なオブジェクトをベストエフォートでデコードしようとします。ストリームがオブジェクトの途中で切れている場合、デコーダーは最後の有効なバイトで停止し、その切断箇所にエラーを表示します。NDJSON 形式の MessagePack ストリームの場合は、オブジェクト境界で分割した後に NDJSON バリデーターを使用してください。

MessagePack と CBOR の違いは何ですか?

両者とも JSON 風のバイナリ形式ですが、CBOR(RFC 8949)は IoT や制約のあるデバイス向けに設計された IETF 標準であり、MessagePack はコミュニティ主導でサーバーサイドの用途に最適化されています。CBOR は 64 ビット整数とバイナリ文字列をネイティブに扱えますが、MessagePack ではこれらに拡張タイプを使用します。本ツールは MessagePack 専用です。

デコード後のツリーで値を編集して再エンコードできるか?

はい。デコード後の JSON ツリーの各フィールドはインラインで編集可能です。文字列の変更、整数の修正、map へのキー追加などを行い、encode を押すと、変更を反映した有効な MessagePack バイナリが生成されます。ラウンドトリップの整合性は自動的に検証されます。

制限事項

  • ストリーミングデコード非対応ツールはバイナリ全体をメモリに展開してデコードします。GB 規模の MessagePack ストリームをインクリメンタルに処理する場合は、ストリーミング対応のコマンドラインデコーダーを使用してください。
  • 拡張タイプは hex として表示MessagePack の拡張タイプ(フォーマットコード 0xc7、0xc8、0xc9)は任意のバイナリペイロードを運びます。インスペクターはこれらを hex ブロブとしてタイプ番号ラベル付きで表示しますが、既知の拡張タイプ(timestamp、UUID など)が検出されない限り解釈は行いません。
  • スキーマ検証なしインスペクターは有効な MessagePack であれば何でもデコードします。スキーマや型定義に対する検証は行いません。スキーマを意識した検査が必要な場合は、デコード後にスキーマバリデーターと組み合わせて使用してください。

プラットフォーム別の注意点

macOS
コマンドラインでの検査には、Homebrew 経由で導入できる `msgpack-tools` が `msgpack2json` と `json2msgpack` を提供します。ブラウザの DevTools ネットワークタブから MessagePack ペイロードを調べる場合は、ブラウザ版ツールが適切な選択です。
Linux
`python3-msgpack` パッケージが CLI 用途の `msgpack2json` を提供します。本ブラウザツールは、CLI ツールにはない hex ビューのサイドパネルとインライン編集機能を備えています。
Web
完全にクライアントサイドで動作します。バイナリデータは端末上に留まります。
広告
広告