微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Go 中编写 LEB128

如何解决如何在 Go 中编写 LEB128

如何在 Go 中将整数写入 LEB128 格式?我正在尝试将 int32 编码为 Minecraft VarInt,到目前为止,我已经尝试将 wiki 上的示例导入到 Go。我在测试时得到了错误的结果,wiki 说 -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
       }
    }
}

解决方法

问题在于移位操作。

>>arithmetic shift 正确,>>>logical shift 正确。不同之处在于 >> 引入符号位(左侧),而 >>> 引入零(无论符号位是什么)。

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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。