如何将具有字节片数据类型的结构转换为字节?

问题描述 投票:0回答:1

我在套接字通信期间需要发送字节切片数据类型的结构数据。

type A struct {
    header []byte
    body   []byte
}

所以我编写了以下源代码,将结构转换为字节。

var a A
a.header = byte slice data...
a.body   = byte slice data...
buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, a)

但是,binary.Write函数出现错误,显示以下错误:

binary.Write: invalid type main.A

在Internet上,我发现固定阵列解决了这个问题。

但是由于数据长度在不断变化,因此我必须使用切片而不是固定数组。

是否有解决此问题的方法?

go serialization slice
1个回答
0
投票

如果编写可变长度的字节片,另一端将不知道需要读取多少字节。您也必须传达长度。

因此,发送字节片的一种方法是先使用固定大小的类型(例如, int32int64。然后只需编写字节片。

例如:

var w io.Writer // This represents your connection
var a A

if err := binary.Write(w, binary.LittleEndian, int32(len(a.header))); err != nil {
    // Handle error
}
if _, err := w.Write(a.header); err != nil {
    // Handle error
}

您也可以使用相同的逻辑发送a.body

另一方面,这是您可以阅读的方式:

var r io.Reader // This represents your connection
var a A

var size int32
if err := binary.Read(r, binary.LittleEndian, &size); err != nil {
    // Handle error
}
a.header = make([]byte, size)
if _, err := io.ReadFull(r, a.header); err != nil {
    // Handle error
}

Go Playground上尝试工作示例。

如果必须传输更复杂的结构,请考虑使用encoding/gob,它可以轻松处理发送片段。有关示例和一些见解,请参见encoding/gob

© www.soinside.com 2019 - 2024. All rights reserved.