package udp import ( "encoding/binary" "errors" ) type ProtocolPacket struct { Opcode uint8 Data []byte } type ApplicationPacket struct { Opcode uint16 Data []byte } func ParseProtocolPacket(data []byte) (*ProtocolPacket, error) { if len(data) < 2 { return nil, errors.New("packet too small") } return &ProtocolPacket{ Opcode: data[1], Data: data[2:], }, nil } func (p *ProtocolPacket) Serialize() []byte { data := make([]byte, 2+len(p.Data)) data[0] = 0x00 // Reserved byte data[1] = p.Opcode copy(data[2:], p.Data) return data } func ParseApplicationPacket(data []byte) (*ApplicationPacket, error) { if len(data) < 2 { return nil, errors.New("application packet too small") } opcode := binary.LittleEndian.Uint16(data[0:2]) return &ApplicationPacket{ Opcode: opcode, Data: data[2:], }, nil } func (p *ApplicationPacket) Serialize() []byte { data := make([]byte, 2+len(p.Data)) binary.LittleEndian.PutUint16(data[0:2], p.Opcode) copy(data[2:], p.Data) return data }