Encoding 当*编码*数字时,有符号和无符号LEB128之间有区别吗?

Encoding 当*编码*数字时,有符号和无符号LEB128之间有区别吗?,encoding,webassembly,Encoding,Webassembly,我知道LEB128解码器需要知道编码的数字是有符号的还是无符号的,但编码器似乎以相同的方式工作(尽管使用不同的函数来编码有符号和无符号的数字) 如果正数在有符号和无符号LEB128中的编码方式相同(仅范围发生变化),负数仅在有符号LEB128中出现,则创建一个对任何整数进行编码的函数(当参数为负时,使用这两个函数的互补)似乎更为合理 我实现了一个按照我描述的方式工作的函数,它似乎工作得很好 这不是一个实现细节(除非我误解了什么)。任何可以对有符号LEB128进行编码的函数都会使任何对无符号LEB

我知道LEB128解码器需要知道编码的数字是有符号的还是无符号的,但编码器似乎以相同的方式工作(尽管使用不同的函数来编码有符号和无符号的数字)

如果正数在有符号和无符号LEB128中的编码方式相同(仅范围发生变化),负数仅在有符号LEB128中出现,则创建一个对任何整数进行编码的函数(当参数为负时,使用这两个函数的互补)似乎更为合理

我实现了一个按照我描述的方式工作的函数,它似乎工作得很好

这不是一个实现细节(除非我误解了什么)。任何可以对有符号LEB128进行编码的函数都会使任何对无符号LEB128进行编码的函数成为完全冗余的函数,因此永远不会有好的理由同时创建这两个函数

我使用了JavaScript,但实际实现并不重要。有没有理由使用有符号和无符号的LEB128编码器

const toLEB128=函数*(arg){
/*这个生成器接受任何BigInt,LEB128编码它,然后
每次产生一个字节的结果(小端)*/
常量数字=参数toString(2).长度;
常量长度=位数+(7-位数%7);
const sevens=new RegExp(“.{1,7}”,“g”);
常量编号=BigInt.asUintN(长度,arg);
const padded=“000000”+number.toString(2);
常量字符串=padded.slice(padded.length%7);
const-eights=string.match(sevens).map(函数(字符串,索引){
/*此回调获取每个七位数的字符串及其
索引(大端),在正确的连续数字前加上前缀,
将8位结果转换为BigInt,然后返回它*/
返回BigInt(“0b”+布尔值(索引)*1+字符串);
});
而(八倍长度)产生八倍波普();
};

阅读维基百科,你会得到一个关于
值>>=7的提示。此操作可以扩展sign-in C,也可以不扩展sign-in C(这可能取决于体系结构)。所以在有符号的情况下,C伪码应该检查填充是否正确(加1),但编码器是否应该将正数转换为完全相同的字节,而不管结果是要解码为有符号还是无符号LEB128?实现并不重要。正如我所理解的:是的(但在第一位上有第一位1,如果是7、14、21、28)