写入特定的字节偏移量。缓冲区

时间:2017-01-23 15:44:25

标签: go tcp

我正在尝试编写游戏服务器并需要创建我将发送回客户端的数据包。我正在将所有数据写入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)))

1 个答案:

答案 0 :(得分:1)

组装完数据包后,您可以直接将长度写入切片。您还需要指定长度前缀大小,以使其在不同平台上相同。

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
}

https://play.golang.org/p/35IX1c18a4