msg.go 1.16 KB
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
}