如何在围棋中编写LEB128

如何在 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

       }

    }

}


守候你守候我
浏览 81回答 1
1回答

慕田峪4524236

问题在于移位操作。>>是算术右移位,是逻辑右移位。不同之处在于,它带来了符号位(在左侧),而带来了零(无论符号位是什么)。>>>>>>>>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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go