我正在尝试编写一个游戏服务器并且需要创建我将发送回客户端的数据包。我正在将所有数据写入 bytes.Buffer
然后我想在获取字节并将其发送到客户端之前为数据包的总大小添加前缀。
我在想这样的事情:
// is it bad to call `var b bytes.Buffer` every time I create a packet?
func CreatePacket() []byte {
var b bytes.Buffer
// size
binary.Write(b, binary.LittleEndian, 0) // insert at end
// body (variable number of writes)
binary.Write(b, binary.LittleEndian, data)
// update the size at offset 0
binary.Write(b, binary.LittleEndian, b.Len())
return b.Bytes()
}
但我找不到任何方法来寻找或修改偏移量。
这行不通,为什么?
var packet = b.Bytes()
// the size is really at offset 2. offset 0 is an ID.
binary.LittleEndian.PutUint16(packet, uint16(0xF3))
binary.LittleEndian.PutUint16(packet, uint16(len(packet)))
最佳答案
您可以在组装数据包后将长度直接写入 slice 。您还需要指定长度前缀大小,以便跨平台时它是相同的。
func CreatePacket(data []byte) []byte {
// leave 4 bytes at the start for the ID and length
b := bytes.NewBuffer(make([]byte, 4))
binary.Write(b, binary.LittleEndian, data)
packet := b.Bytes()
// insert the ID and prefix
binary.LittleEndian.PutUint16(packet, uint16(0xF3))
binary.LittleEndian.PutUint16(packet[2:], uint16(len(packet)))
return packet
}
关于go - 写入特定的 bytes.Buffer 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41810188/