package net import ( "bytes" "encoding/binary" "fmt" "pro2d/common" ) func ParseMsg (data []byte, atEOF bool) (advance int, token []byte, err error) { // 表示我们已经扫描到结尾了 if atEOF && len(data) == 0 { return 0, nil, nil } if !atEOF && len(data) >= common.HEADLEN { //4字节数据包长度 4字节指令 length := int32(0) binary.Read(bytes.NewReader(data[0:4]), binary.BigEndian, &length) if length <= 0 { return 0, nil, fmt.Errorf("length is 0") } if int(length) <= len(data) { return int(length) , data[:int(length)], nil } return 0 , nil, nil } if atEOF { return len(data), data, nil } return 0, nil, nil } func DecodeMsg(data []byte) (*MsgPkg, error) { h := &Head{} err := binary.Read(bytes.NewReader(data), binary.BigEndian, h) if err != nil { return nil, err } return &MsgPkg{ Head: h, Body: data[common.HEADLEN:], },nil } func EncodeMsg(pkg *MsgPkg) ([]byte, error) { buf := &bytes.Buffer{} err := binary.Write(buf, binary.BigEndian, pkg.Head) if err != nil { return nil, err } err = binary.Write(buf, binary.BigEndian, pkg.Body) if err != nil { return nil, err } return buf.Bytes(), nil }