62 lines
1.2 KiB
Go
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);
|
|
}
|