如何在Go语言中编写LEB128

5
你如何在Go语言中将整数编码为LEB128格式?我试图将int32编码为Minecraft VarInt,迄今为止,我已经尝试将维基百科上的示例导入Go中。然而,在测试时,我得到了错误的结果。维基百科说-1应该等于[255 255 255 255 15],但我得到的是[255 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个回答

6
问题出在移位操作上。 >>算术右移>>>逻辑右移。区别在于>>会带入符号位(在左边),而>>>带入零(无论符号位是什么)。
LEB128的Varint算法使用逻辑移位,Go的>>是算术移位。
在Go中没有明显的逻辑移位,但如果将数字视为无符号数,则可以得到完全相同的结果:
func WriteVarInt2(v_ int32) []byte {
    v := uint32(v_)

    // rest of your function unchanged
    // ...
}

测试它:

fmt.Println(WriteVarInt2(-1))

输出结果与预期相符(在Go Playground上尝试):

[255 255 255 255 15]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接