package pdu import ( "encoding/binary" "fmt" ) type ( PDU interface { EncodeInto(*[]uint8) Encode() []uint8 Decode([]uint8) // Size in bytes Size() uint32 } PDU_HEADER struct { command_length uint32 command_id uint32 command_status uint32 sequence_number uint32 } GENERIC_NACK struct { PDU_HEADER } ) func (p *PDU_HEADER) Encode() ([]uint8, error) { buf := make([]uint8, 16) binary.BigEndian.PutUint32(buf[0:4], p.command_length) binary.BigEndian.PutUint32(buf[4:8], p.command_id) binary.BigEndian.PutUint32(buf[8:12], p.command_status) binary.BigEndian.PutUint32(buf[12:16], p.sequence_number) return buf, nil } func (p *PDU_HEADER) EncodeInto(buf *[]uint8) error { if buf == nil { return fmt.Errorf("cannot encode PDU_HEADER, buffer is nil") } if len(*buf) < 16 { return fmt.Errorf("cannot encode PDU_HEADER, buffer too small (%d, required 16)", len(*buf)) } bufVal := *buf binary.BigEndian.PutUint32(bufVal[0:4], p.command_length) binary.BigEndian.PutUint32(bufVal[4:8], p.command_id) binary.BigEndian.PutUint32(bufVal[8:12], p.command_status) binary.BigEndian.PutUint32(bufVal[12:16], p.sequence_number) return nil } func (p *PDU_HEADER) Decode(data []uint8) error { if len(data) >= 4 { p.command_length = binary.BigEndian.Uint32(data[0:4]) } if len(data) >= 8 { p.command_id = binary.BigEndian.Uint32(data[4:8]) } if len(data) >= 12 { p.command_status = binary.BigEndian.Uint32(data[8:12]) } if len(data) >= 16 { p.sequence_number = binary.BigEndian.Uint32(data[12:16]) } return nil } func (p *PDU_HEADER) Size() uint32 { return 16 }