VarInt エンコーダー / デコーダー
10進数の値
VarInt 出力
技術的な詳細
VarIntエンコーダー/デコーダーの仕組み
このツールでできること
VarIntツールは、符号なし整数をProtobufスタイルのLEB128可変長整数としてエンコードし、バイナリのVarIntストリームを整数リストへデコードします。各値は大きさに応じて1〜10バイトでエンコードされ、各バイトの最上位ビットが後続バイトの有無を示します。出力は、バイト配列、16進数、またはBase64として表示され、テストやフィクスチャに埋め込みやすくなっています。
開発者によくある利用シーン
Protobufのワイヤーフォーマットのペイロードをデバッグするエンジニアは、VarIntのエンコード/デコードを使って、完全なProtobufランタイムを立ち上げることなくフィールドタグや符号なし整数フィールド値を確認します。Bitcoinなどの暗号通貨開発者は、VarIntでエンコードされたスクリプト長やトランザクション数を解析します。このツールは、小さな数に対してコンパクトであることからLEB128を採用するカスタムバイナリプロトコルをリバースエンジニアリングする際にも役立ちます。
データ形式、型、またはバリエーション
LEB128(Little-Endian Base 128)は、1バイトあたり7ビットのペイロードを出力し、最上位ビットを継続フラグとして使用します。小さな数(0〜127)は1バイト、16,383までの数は2バイト、という具合です。入力は、空白、カンマ、または改行で区切られた10進数を受け付けます。出力は16進数、Base64、そして生のバイト配列表記で利用できます。符号付き整数は、まずZigZag変換 (n << 1) ^ (n >> 31) を適用してからエンコードできます。
よくある落とし穴とエッジケース
JavaScriptの数値精度は2^53 − 1が上限であり、Number.MAX_SAFE_INTEGERを超える値は安全にエンコードできません。途中で切れたVarIntストリーム(終端バイトが欠落)は部分的にデコードされ、オフセットを示すエラーが返ります。負の数は直接エンコードできないため、先にZigZagエンコーディングを使用してください。Base64のパディングが削除されている可能性があるスクリーンショットからVarIntバイトをコピーするのは避けてください。パディング欠落によりバイト境界が変わります。
コードではなくこのツールを使うべき場面
デバッグ中やテスト作成中にProtobufのワイヤーバイトを素早く確認するには、このブラウザツールを使ってください。本番のエンコードには、言語ネイティブのVarIntライブラリ(npmの`varint`、Goのencoding/binaryの`binary.varint`、Pythonのgoogle.protobuf.internalの`decode_varint`)を使用してください。これらはストリーミング、エラー回復、ZigZag変換を1回の呼び出しで処理します。