正确的惯用字节缓冲区读写

时间:2014-05-20 18:51:50

标签: go

我打开了一个网络/套接字。我需要通过网络阅读结构化协议。即我有

messagelength|type|value|type|value ...

其中messagelength是4个字节,键入一个字节,值取决于类型,...

我正试图找出这样做的简单方法。我被io,bufio,编码淹没......我找不到合适的地方开始,无法找到样品。寻找ReadInt32,ReadByte,....

接下来的事情 - 我需要收集回复 - > WriteInt32,WriteString,WriteByte,....

尝试将python转换为go,python代码使用struct.unpack / pack

1 个答案:

答案 0 :(得分:3)

您可以使用包encoding/binary。您需要的唯一功能是Read()Write()。以下是您如何使用它们:

Read()函数具有以下签名:

func Read(r io.Reader, order ByteOrder, data interface{}) error

此函数从r按顺序ByteOrder读取数据。 data必须是指向固定大小值的指针(例如int32,仅具有固定大小成员的字节或结构)或一片此类值。如果将指针传递给结构,则在没有填充的情况下读取结构字段,读取和丢弃对应于空白字段的数据(即名为_的数据)(适用于填充)。

针对您的特定问题,声明一个与数据流标题匹配的结构。

type Header struct {
    Length uint32
    Type   uint8
}

使用数据包的标头(假设是大端):

var hdr Header
if err = Read(connection, binary.BigEndian, &hdr); err != nil {
    // deal with read error
}

切换类型字节:

switch hdr.Type {
// for each type, read into a type-specific struct
// ...
}

Write()类似但是写而不是阅读。