如何在 Go 中将整数写入 LEB128 格式?我正在尝试将 int32 编码为我的世界 VarInt,到目前为止,我已经尝试将 wiki 上的示例导入 Go。我在测试时得到了错误的结果,维基说-1应该等于[255 255 255 255 15],但我得到的是[255 255 255 255]。我在这里做错了什么?func WriteVarInt2(v int32) []byte{ var out []byte c := 0 for{ currentByte := byte(v & 0b01111111) v >>= 7 if v != 0 { currentByte |= 0b10000000 } out = append(out, currentByte) c++ if c >= 5 || v == 0{ return out } }}
1 回答

慕田峪4524236
TA贡献1875条经验 获得超5个赞
问题在于移位操作。
>>是算术右移位,是逻辑右移位。不同之处在于,它带来了符号位(在左侧),而带来了零(无论符号位是什么)。>>>>>>>>
LEB128 的瓦林特算法使用逻辑移位,而 Go 的算法是算术移位。>>
Go中没有明显的逻辑偏移,但是如果您将数字视为无符号,您将得到确切的结果:
func WriteVarInt2(v_ int32) []byte {
v := uint32(v_)
// rest of your function unchanged
// ...
}
测试它:
fmt.Println(WriteVarInt2(-1))
输出符合预期(在 Go 游乐场试用):
[255 255 255 255 15]
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消