Skip to content
Snippets Groups Projects
decode.go 1.18 KiB
Newer Older
package decode

import (
	"bytes"
	"encoding/binary"
Julian Kornberger's avatar
Julian Kornberger committed

	"github.com/pkg/errors"
)

// Decode reads fields from a buffer
func Decode(buf *bytes.Buffer, fields []interface{}) error {
	var err error
	for _, field := range fields {
		err = binary.Read(buf, binary.BigEndian, field)
		if err != nil {
Julian Kornberger's avatar
Julian Kornberger committed
			return errors.Wrap(err, "Unable to read from buffer")
Oliver Herms's avatar
Oliver Herms committed
// DecodeUint8 decodes an uint8
takt's avatar
takt committed
func DecodeUint8(buf *bytes.Buffer, x *uint8) error {
	y, err := buf.ReadByte()
	if err != nil {
		return err
	}

	*x = y
	return nil
}

Oliver Herms's avatar
Oliver Herms committed
// DecodeUint16 decodes an uint16
takt's avatar
takt committed
func DecodeUint16(buf *bytes.Buffer, x *uint16) error {
	a, err := buf.ReadByte()
	if err != nil {
		return err
	}

	b, err := buf.ReadByte()
	if err != nil {
		return err
	}

Oliver Herms's avatar
Oliver Herms committed
	*x = uint16(a)<<8 + uint16(b)
takt's avatar
takt committed
	return nil
}

Oliver Herms's avatar
Oliver Herms committed
// DecodeUint32 decodes an uint32
takt's avatar
takt committed
func DecodeUint32(buf *bytes.Buffer, x *uint32) error {
	a, err := buf.ReadByte()
	if err != nil {
		return err
	}

	b, err := buf.ReadByte()
	if err != nil {
		return err
	}

	c, err := buf.ReadByte()
	if err != nil {
		return err
	}

	d, err := buf.ReadByte()
	if err != nil {
		return err
	}

Oliver Herms's avatar
Oliver Herms committed
	*x = uint32(a)<<24 + uint32(b)<<16 + uint32(c)<<8 + uint32(d)
takt's avatar
takt committed
	return nil
}