如何在 Go 中编写 LEB128
How to write LEB128 in Go
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 right, >>>
is 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]
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 right, >>>
is 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]