Go语言实现LEB128编码 修复Minecraft VarInt编码-1结果异常问题
Go实现Minecraft VarInt编码的错误修复
问题根源
你遇到的编码错误核心来自Go语言的右移特性:
- 有符号整数的
>>操作是算术右移,负数右移时高位会补符号位1 - 当输入为
-1时,int32类型的v每次右移7位后永远都是-1,永远不会等于0,导致每个输出字节的最高位都会被置为1,最终跑满5次循环输出错误结果。
修复代码
Minecraft VarInt要求将int32视为无符号整数做无符号LEB128编码,只需要先将输入转为uint32再执行位移即可:
func WriteVarInt2(v int32) []byte { var out []byte value := uint32(v) // 转为无符号整数,右移时补0而非符号位 for { currentByte := byte(value & 0b01111111) value >>= 7 if value != 0 { currentByte |= 0b10000000 } out = append(out, currentByte) if len(out) >= 5 || value == 0 { return out } } }
验证说明
输入-1时,转换为uint32值为0xFFFFFFFF,编码过程最终输出为[255 255 255 255 15],完全符合Minecraft协议要求。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

