【发布时间】:2022-01-15 14:42:45
【问题描述】:
我是 Golang 的初学者。最近我在从 Minecraft 客户端读取数据包时遇到问题。
我的程序就是这样从连接中读取数据包的。
player := &Player{
conn: conn,
state: HANDSHAKING,
io: &ConnReadWrite{
rdr: bufio.NewReader(conn),
wtr: bufio.NewWriter(conn),
},
inaddr: InAddr{
"",
0,
},
keepalive: 0,
compression: false
}
func (player *Player) ReadVarInt() (i int, err error) {
val, _ := binary.ReadUvarint(player.io)
return int(val), nil
}
工作了好几天,想重写复制wiki.vg的解决方案,但是好像不行
PS:我的副本和原件
val, length := 0, 0
for {
current, err := player.io.ReadByte()
if err != nil {
return 0, err
}
val |= int((current & 0x7F) << (length * 7))
length += 1
if length > 5 {
return 0, errors.New(fmt.Sprintf("%s: VarInt is too big", player.name))
}
if val&0x80 != 0x80 {
break
}
}
return int(val), nil
int value = 0;
int length = 0;
byte currentByte;
while (true) {
currentByte = readByte();
value |= (currentByte & 0x7F) << (length * 7);
length += 1;
if (length > 5) {
throw new RuntimeException("VarInt is too big");
}
if ((value & 0x80) != 0x80) {
break;
}
}
return value;
【问题讨论】:
-
我对原作有点困惑。首先,值为 (currentByte&0x7F),表示最高有效位为空。然后 (value & 0x80) 尝试读取所述最高有效位,该位不再存在。在我看来,它应该是 currentByte & 0x80,而不是 value & 0x80。