Wasm二进制格式使用LEB128来编码列表长度和索引等整数值。LEB128是一种变长编码格式,对于32位整数来说编码后可能是1到5个字节,对于64位整数来说编码后可能是1到10个字节,越小的数编码后占用的字节数就越少。这种编码格式可以起到节约空间的作用。
LEB128有两个特点:
一、采用小端编码方式,低位字节在前,高位字节在后。
二、采用128进制,每7个比特为一组,由一个字节的第7位承载,空出来的最高位是标志符,1表示还有后续字节,0表示没有
无符号整数解码:
11100101 10001110 00100110
字节1 字节2 字节3
判断字节数去掉高位顺序反转的最终结果
000 0100110 0001110 1100101
字节3 字节2 字节1
有符号的整数解码:
11000000 10111011 01111000
字节1 字节2 字节3
判断字节数去掉高位顺序反转,最后一个字节的第二高位是符号位,表示这是一个负数,需要将高位全部补1,反之如果是0则表示这是一个正数,需要将高位全部补0,结果如下
111 1111000 0111011 1000000
字节3 字节2 字节1