GO-binary.PutUvarint在数值大于127时添加1

GO-binary.PutUvarint在数值大于127时添加1,go,Go,一切都在标题中 当数值大于127时,GO函数binary.PutUvarint加1 我已经搜索了堆栈溢出和github问题,但没有找到响应 所以我发这条消息是想知道是否有人能帮忙 谢谢,对不起,我英语不好 b:=make[]字节,二进制。maxVarintern64 二元葡萄球菌,129 打印格式 //输出 // [129 1 0 0 0 0 0 0 0 0] binary.LittleEndian.putunit64b,129 打印格式 //输出 // [129 0 0 0 0 0 0 0 0

一切都在标题中

当数值大于127时,GO函数binary.PutUvarint加1

我已经搜索了堆栈溢出和github问题,但没有找到响应

所以我发这条消息是想知道是否有人能帮忙

谢谢,对不起,我英语不好

b:=make[]字节,二进制。maxVarintern64 二元葡萄球菌,129 打印格式 //输出 // [129 1 0 0 0 0 0 0 0 0] binary.LittleEndian.putunit64b,129 打印格式 //输出 // [129 0 0 0 0 0 0 0 0 0] 我已经搜索了堆栈溢出和github问题,但没有找到 答复

首先要看的是Go包文档

导入编码/二进制

varint函数使用 可变长度编码;较小的值需要较少的字节。暂时 规格,请参阅


始终阅读文档。

您知道varint是什么吗?它是一种可变大小编码,基本上一次编码7位,每个字节的高位128用于表示另一个字节已经编码。基本上,它将位为12345678的值编码为位为1234567x 80000000的两个字节,其中x用于表示存在另一个字节,并设置为1。巧合的是,这与您要求它开始编码的值相同,因此看起来可疑。如果检查调用PutUvarint的结果,您应该会发现它返回2,告诉您它将输入编码为2字节。MAXVarintern64只是编码所有可能值所需的最大长度。您可以在中找到更多信息。我不明白,PutUvarint采用uint64,而不是int。那么为什么要将有符号位放在这里呢。它不是一个符号位,而是你的值需要8位来存储,所以它被分成2个字节,这就是varint的工作原理。它没有存储8个字节,而是存储了2个,varint是一种可变大小的整数编码技术,可以节省空间,较小的值需要更少的字节。