Support VarLong encode/decode

This commit is contained in:
Tnze
2020-01-29 13:57:57 +08:00
parent e5004ab9c9
commit 72c389c86f
2 changed files with 85 additions and 29 deletions

View File

@ -1,6 +1,7 @@
package packet
import (
"errors"
"github.com/google/uuid"
"io"
"math"
@ -268,7 +269,7 @@ func (v VarInt) Encode() (vi []byte) {
//Decode a VarInt
func (v *VarInt) Decode(r DecodeReader) error {
var n uint32
for i := 0; i < 5; i++ { //读数据前的长度标记
for i := 0; ; i++ { //读数据前的长度标记
sec, err := r.ReadByte()
if err != nil {
return err
@ -278,6 +279,8 @@ func (v *VarInt) Decode(r DecodeReader) error {
if sec&0x80 == 0 {
break
} else if i > 5 {
return errors.New("VarInt is too big")
}
}
@ -285,6 +288,45 @@ func (v *VarInt) Decode(r DecodeReader) error {
return nil
}
//Encode a VarLong
func (v VarLong) Encode() (vi []byte) {
num := uint64(v)
for {
b := num & 0x7F
num >>= 7
if num != 0 {
b |= 0x80
}
vi = append(vi, byte(b))
if num == 0 {
break
}
}
return
}
//Decode a VarLong
func (v *VarLong) Decode(r DecodeReader) error {
var n uint64
for i := 0; ; i++ { //读数据前的长度标记
sec, err := r.ReadByte()
if err != nil {
return err
}
n |= uint64(sec&0x7F) << uint64(7*i)
if sec&0x80 == 0 {
break
} else if i > 10 {
return errors.New("VarInt is too big")
}
}
*v = VarLong(n)
return nil
}
//Encode a Position
func (p Position) Encode() []byte {
b := make([]byte, 8)