new server
This commit is contained in:
@@ -1,6 +1,48 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type Message struct {
|
||||
Type int8
|
||||
Payload interface{}
|
||||
Type uint16
|
||||
Version uint16
|
||||
Payload []byte
|
||||
}
|
||||
|
||||
func (m *Message) Encode() []byte {
|
||||
payloadLen := len(m.Payload)
|
||||
if payloadLen > 0xFFFF {
|
||||
return nil
|
||||
}
|
||||
|
||||
buf := make([]byte, 8+payloadLen)
|
||||
|
||||
binary.LittleEndian.PutUint16(buf[0:2], m.Type)
|
||||
binary.LittleEndian.PutUint16(buf[2:4], m.Version)
|
||||
binary.LittleEndian.PutUint16(buf[4:6], uint16(payloadLen))
|
||||
|
||||
copy(buf[8:], m.Payload)
|
||||
return buf
|
||||
}
|
||||
|
||||
func Decode(data []byte) (*Message, error) {
|
||||
if len(data) < 8 {
|
||||
return nil, errors.New("message too short")
|
||||
}
|
||||
|
||||
payloadLen := binary.LittleEndian.Uint16(data[4:6])
|
||||
if len(data) != int(8+payloadLen) {
|
||||
return nil, errors.New("invalid payload length")
|
||||
}
|
||||
|
||||
msg := &Message{
|
||||
Type: binary.LittleEndian.Uint16(data[0:2]),
|
||||
Version: binary.LittleEndian.Uint16(data[2:4]),
|
||||
Payload: make([]byte, payloadLen),
|
||||
}
|
||||
|
||||
copy(msg.Payload, data[8:])
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user