hnakra/protocol/buf.go

71 lines
1.9 KiB
Go

package protocol
import "io"
import "fmt"
// ReadBuf reads a size-prefixed buffer.
func ReadBuf (sizeBytes int, reader io.Reader) (buf []byte, err error) {
size, err := ReadInt(reader, sizeBytes)
if err != nil { return nil, err }
buf = make([]byte, size)
_, err = io.ReadFull(reader, buf)
return buf, err
}
// ReadBuf8 reads a size-prefixed buffer with an 8-bit size.
func ReadBuf8 (reader io.Reader) (buf []byte, err error) {
return ReadBuf(1, reader)
}
// ReadBuf16 reads a size-prefixed buffer with a 16-bit size.
func ReadBuf16 (reader io.Reader) (buf []byte, err error) {
return ReadBuf(2, reader)
}
// ReadString reads a size-prefixed string.
func ReadString (sizeBytes int, reader io.Reader) (str string, err error) {
buf, err := ReadBuf(sizeBytes, reader)
return string(buf), err
}
// ReadString8 reads a size-prefixed string with an 8-bit size.
func ReadString8 (reader io.Reader) (str string, err error) {
return ReadString(1, reader)
}
// ReadString16 reads a size-prefixed string with a 16-bit size.
func ReadString16 (reader io.Reader) (str string, err error) {
return ReadString(2, reader)
}
func WriteBuf (writer io.Writer, sizeBytes int, buf []byte) (err error) {
if uint(len(buf)) > MaxIntOfSize(sizeBytes) {
panic(fmt.Sprintf("len %d cannot fit in U%d", len(buf), sizeBytes * 8))
}
err = WriteInt(writer, sizeBytes, uint(len(buf)))
if err != nil { return }
_, err = writer.Write(buf)
return
}
func WriteBuf8 (writer io.Writer, buf []byte) error {
return WriteBuf(writer, 1, buf)
}
func WriteBuf16 (writer io.Writer, buf []byte) error {
return WriteBuf(writer, 2, buf)
}
func WriteString (writer io.Writer, sizeBytes int, str string) (err error) {
return WriteBuf(writer, sizeBytes, []byte(str))
}
func WriteString8 (writer io.Writer, str string) (err error) {
return WriteBuf8(writer, []byte(str))
}
func WriteString16 (writer io.Writer, str string) (err error) {
return WriteBuf16(writer, []byte(str))
}