diff --git a/utils/io/binary.go b/utils/io/binary.go new file mode 100644 index 0000000..5a3aca7 --- /dev/null +++ b/utils/io/binary.go @@ -0,0 +1,87 @@ +package io + +import ( + "bufio" + "encoding/binary" + "io" +) + +func WriteUint8Field(writer *bufio.Writer, data uint8) error { + if err := writer.WriteByte(data); err != nil { + return err + } + return nil +} + +func ReadUint8Field(reader *bufio.Reader) (uint8, error) { + data, err := reader.ReadByte() + if err != nil { + return 0, err + } + return data, nil +} + +func WriteUint16Field(writer *bufio.Writer, data uint16) error { + dataBytes := make([]byte, 2) + binary.BigEndian.PutUint16(dataBytes, data) + + _, err := writer.Write(dataBytes) + if err != nil { + return err + } + return nil +} + +func ReadUint16Field(reader *bufio.Reader) (uint16, error) { + dataBytes := make([]byte, 2) + _, err := io.ReadFull(reader, dataBytes) + if err != nil { + return 0, err + } + return binary.BigEndian.Uint16(dataBytes), nil +} + +func WriteUint32Field(writer *bufio.Writer, data uint32) error { + dataBytes := make([]byte, 4) + binary.BigEndian.PutUint32(dataBytes, data) + + _, err := writer.Write(dataBytes) + if err != nil { + return err + } + return nil +} + +func ReadUint32Field(reader *bufio.Reader) (uint32, error) { + dataBytes := make([]byte, 4) + _, err := io.ReadFull(reader, dataBytes) + if err != nil { + return 0, err + } + return binary.BigEndian.Uint32(dataBytes), nil +} + +func WriteStringField(writer *bufio.Writer, data string) error { + if err := writer.WriteByte(byte(len(data))); err != nil { + return err + } + _, err := writer.WriteString(data) + if err != nil { + return err + } + return nil +} + +func ReadStringField(reader *bufio.Reader) (string, error) { + length, err := reader.ReadByte() + if err != nil { + return "", err + } + + dataBytes := make([]byte, length) + _, err = io.ReadFull(reader, dataBytes) + if err != nil { + return "", err + } + return string(dataBytes), nil +}