LEB128 encoding format について

WebAssembly では、すべての整数が LEB128 方式でエンコードされる。エンコードは符号あり/ なしでアルゴリズムが異なる。これを理解していないとデコードしたときに期待する値を得られない。

符号なし

624,485 は、以下のプロセスで 0xE5 0x8E 0x26エンコードされる。

10011000011101100101
010011000011101100101        7 の倍数 bit になるようパディングを追加
0100110 0001110 1100101      7 bit ごとに区切る
00100110 10001110 11100101   最上位のグループには 0, それ以外は 1 を高位 bit に追加
0x26 0x8E 0xE5

-> 0xE5 0x8E 0x26

トルエンディアンなので、最下位のバイトから出力され最終的には 0xE5 0x8E 0x26 となる。

符号あり

-123456 は、以下のプロセスで 0xC0 0xBB 0x78エンコードされる。

111100001110111000000
1111000 0111011 1000000
01111000 10111011 11000000
0x78 0xBB 0xC0

-> 0xC0 0xBB 0x78

符号なしと同様かと思われるが、sign bit の取り扱いに気をつけなければならない。最上位のバイトの sign bit (0x40) が正負を表すようになっている。

640xC0 0x0エンコードされるが、0xC0 としてしまうと -64 との区別がつけられなくなってしまうため、最上位のバイトの sign bit が 1 にならないようにもう 1 byte 必要とする。

1000000
00000000 11000000
0x0 0xC0

-> 0xC0 0x0

-650xBF 0x7Fエンコードされる。

0111111
01111111 10111111
0x7F 0xBF

-> 0xBF 0x7F