55 lines
1020 B
Go
55 lines
1020 B
Go
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
|
|
}
|