github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/client/internal/highway/frame.go (about)

     1  package highway
     2  
     3  import (
     4  	"encoding/binary"
     5  	"net"
     6  )
     7  
     8  var etx = []byte{0x29}
     9  
    10  // frame 包格式
    11  //
    12  //   - STX: 0x28(40)
    13  //   - head length
    14  //   - body length
    15  //   - head data
    16  //   - body data
    17  //   - ETX: 0x29(41)
    18  //
    19  // 节省内存, 可被go runtime优化为writev操作
    20  func frame(head []byte, body []byte) net.Buffers {
    21  	buffers := make(net.Buffers, 4)
    22  	// buffer0 format:
    23  	// 	- STX
    24  	// 	- head length
    25  	// 	- body length
    26  	buffer0 := make([]byte, 9)
    27  	buffer0[0] = 0x28
    28  	binary.BigEndian.PutUint32(buffer0[1:], uint32(len(head)))
    29  	binary.BigEndian.PutUint32(buffer0[5:], uint32(len(body)))
    30  	buffers[0] = buffer0
    31  	buffers[1] = head
    32  	buffers[2] = body
    33  	buffers[3] = etx
    34  	return buffers
    35  }