mirror of
https://gitee.com/winc-link/hummingbird.git
synced 2025-04-20 00:12:43 +00:00
74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
package encoding
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
func WriteUint16(w *bytes.Buffer, i uint16) {
|
|
w.WriteByte(byte(i >> 8))
|
|
w.WriteByte(byte(i))
|
|
}
|
|
|
|
func WriteBool(w *bytes.Buffer, b bool) {
|
|
if b {
|
|
w.WriteByte(1)
|
|
} else {
|
|
w.WriteByte(0)
|
|
}
|
|
}
|
|
|
|
func ReadBool(r *bytes.Buffer) (bool, error) {
|
|
b, err := r.ReadByte()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if b == 0 {
|
|
return false, nil
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func WriteString(w *bytes.Buffer, s []byte) {
|
|
WriteUint16(w, uint16(len(s)))
|
|
w.Write(s)
|
|
}
|
|
func ReadString(r *bytes.Buffer) (b []byte, err error) {
|
|
l := make([]byte, 2)
|
|
_, err = io.ReadFull(r, l)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
length := int(binary.BigEndian.Uint16(l))
|
|
paylaod := make([]byte, length)
|
|
|
|
_, err = io.ReadFull(r, paylaod)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return paylaod, nil
|
|
}
|
|
|
|
func WriteUint32(w *bytes.Buffer, i uint32) {
|
|
w.WriteByte(byte(i >> 24))
|
|
w.WriteByte(byte(i >> 16))
|
|
w.WriteByte(byte(i >> 8))
|
|
w.WriteByte(byte(i))
|
|
}
|
|
|
|
func ReadUint16(r *bytes.Buffer) (uint16, error) {
|
|
if r.Len() < 2 {
|
|
return 0, errors.New("invalid length")
|
|
}
|
|
return binary.BigEndian.Uint16(r.Next(2)), nil
|
|
}
|
|
|
|
func ReadUint32(r *bytes.Buffer) (uint32, error) {
|
|
if r.Len() < 4 {
|
|
return 0, errors.New("invalid length")
|
|
}
|
|
return binary.BigEndian.Uint32(r.Next(4)), nil
|
|
}
|