diff --git a/pdu/pdu.go b/pdu/pdu.go index 41be703..e724952 100644 --- a/pdu/pdu.go +++ b/pdu/pdu.go @@ -2,6 +2,7 @@ package pdu type ( PDU interface { + EncodeInto(*[]byte) Encode() []byte Decode([]byte) } @@ -19,12 +20,23 @@ type ( ) func (p *PDU_HEADER) Encode() []byte { - // Encode PDU_HEADER fields to byte slice - // (For simplicity, we assume little-endian encoding) - buf := make([]byte, 16) - encodeUint32(buf[0:4], p.command_length) - encodeUint32(buf[4:8], p.command_id) - encodeUint32(buf[8:12], p.command_status) - encodeUint32(buf[12:16], p.sequence_number) - return buf + buf := make([]byte, 16) + EncodeUint32(buf[0:4], p.command_length) + EncodeUint32(buf[4:8], p.command_id) + EncodeUint32(buf[8:12], p.command_status) + EncodeUint32(buf[12:16], p.sequence_number) + return buf +} +func (p *PDU_HEADER) EncodeInto(buf *[]byte) { + bufVal := *buf + EncodeUint32(bufVal[0:4], p.command_length) + EncodeUint32(bufVal[4:8], p.command_id) + EncodeUint32(bufVal[8:12], p.command_status) + EncodeUint32(bufVal[12:16], p.sequence_number) +} +func (p *PDU_HEADER) Decode(data []byte) { + p.command_length = DecodeUint32(data[0:4]) + p.command_id = DecodeUint32(data[4:8]) + p.command_status = DecodeUint32(data[8:12]) + p.sequence_number = DecodeUint32(data[12:16]) } diff --git a/pdu/util.go b/pdu/util.go index 2d79d95..2b685db 100644 --- a/pdu/util.go +++ b/pdu/util.go @@ -1 +1,14 @@ package pdu + +// EncodeUint32 encodes a uint32 into a byte slice in big-endian order +func EncodeUint32(b []byte, i uint32) { + b[0] = byte(i >> 24) + b[1] = byte(i >> 16) + b[2] = byte(i >> 8) + b[3] = byte(i) +} + +// DecodeUint32 decodes a uint32 from a byte slice in big-endian order +func DecodeUint32(b []byte) uint32 { + return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]) +}