Proto/binutil.go
2023-11-28 21:07:48 +01:00

62 lines
1.2 KiB
Go

package main
import (
"encoding/binary"
"io"
"fmt"
)
var BE = binary.BigEndian
func readU8(r io.Reader) (uint8, error) {
var result uint8
err := binary.Read(r, BE, &result);
return result, err
}
func readU16(r io.Reader) (uint16, error) {
var result uint16
err := binary.Read(r, BE, &result);
return result, err
}
func readU32(r io.Reader) (uint32, error) {
var result uint32
err := binary.Read(r, BE, &result);
return result, err
}
func readString(r io.Reader) (string, error) {
l, err := readU8(r)
if err == nil && l == 0 {
err = fmt.Errorf("invalid string length 0")
}
if err != nil { return "", err}
buf := make([]byte, l)
_, err = io.ReadFull(r, buf)
return string(buf), err
}
func readLString(r io.Reader) (string, error) {
l, err := readU32(r)
if err == nil && l == 0 {
err = fmt.Errorf("invalid string length 0")
}
if err != nil { return "", err}
buf := make([]byte, l)
_, err = io.ReadFull(r, buf)
return string(buf), err
}
func writeLString(w io.Writer, s string) error {
writeU32(w,uint32(len(s)))
_, err := w.Write([]byte(s))
return err
}
func writeU8(w io.Writer, i uint8) error {
return binary.Write(w, BE, i);
}
func writeU32(w io.Writer, i uint32) error {
return binary.Write(w, BE, i);
}