为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕丝7291255 2022-05-18 14:33:58
我需要在套接字通信期间发送具有字节切片数据类型的结构数据。type A struct {    header []byte    body   []byte}所以我编写了以下源代码将结构转换为字节。var a Aa.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我发现固定数组解决了这个问题。但是由于数据的长度是不断变化的,所以我不得不使用切片而不是固定数组。有没有办法解决这个问题?
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


因此,发送字节切片的一种方法是首先使用固定大小的类型写入长度(字节数),例如int32or int64。然后简单地写入字节片。


例如:


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/gobwhich 处理轻松发送切片。有关示例和一些见解,请参阅Efficient Go serialization of struct to disk。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号