1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| package main
import ( "bytes" "encoding/binary" "errors" "net" "strconv" "strings" "encoding/hex" )
func encode(d []byte) ([]byte, error) { var pack = new(bytes.Buffer) var err error
headerTag := []byte("=-=")
l := len(d) lHexStr := strconv.FormatInt(int64(l), 16) fullHexStr := strings.Repeat("0", 8-len(lHexStr)) + lHexStr msgLength, err := hex.DecodeString(fullHexStr) if err != nil { return nil, errors.New("decode hex to string error:" + err.Error()) }
err = binary.Write(pack, binary.BigEndian, headerTag) if err != nil { return nil, errors.New("write header tag error::" + err.Error()) }
err = binary.Write(pack, binary.BigEndian, msgLength) if err != nil { return nil, errors.New("write message length error:" + err.Error()) } err = binary.Write(pack, binary.BigEndian, d) if err != nil { return nil, errors.New("write data error:" + err.Error()) } return pack.Bytes(), nil }
func decode(conn net.Conn) ([]byte, error) { var tmpHeaderTag = make([]byte, 3) n, err := conn.Read(tmpHeaderTag) if err != nil { return nil, err } var headerTag = make([]byte, 3) err = binary.Read(bytes.NewBuffer(tmpHeaderTag[:n]), binary.BigEndian, headerTag) if err != nil { return nil, err } if string(headerTag) != "=-=" { return nil, errors.New("error header tag") }
var tmpDataLength = make([]byte, 4) n, err = conn.Read(tmpDataLength) if err != nil { return nil, err } var dataLength = make([]byte, 4) err = binary.Read(bytes.NewBuffer(tmpDataLength[:n]), binary.BigEndian, dataLength) if err != nil { return nil, err }
dataLengthHexStr := hex.EncodeToString(dataLength) var length int64 length, err = strconv.ParseInt(dataLengthHexStr, 16, 64) if err != nil { return nil, err }
totalLength := int(length) received := 0 var pack []byte var buff = make([]byte, 4096) for { if received >= totalLength { break } r := totalLength - received if r <= 4096 { buff = make([]byte, r) } n, err := conn.Read(buff) if err != nil { return nil, err } pack = append(pack, buff[:n]...) received += n } if pack == nil { return nil, errors.New("empty data") }
var result = make([]byte, totalLength) err = binary.Read(bytes.NewBuffer(pack), binary.BigEndian, result) if err != nil { return nil, err } return result[:], nil }
|