You need to enable JavaScript to run this app. Go语言实现LEB128编码 修复Minecraft VarInt编码-1结果异常问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 07:06:07