gpt4 book ai didi

networking - 在 Go 中将结构转换为字节 slice 的紧凑方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:59:03 26 4
gpt4 key购买 nike

在编写网络代码时,我们经常发现自己从字节 slice 填充结构以访问对象形式的数据。

让我们采用这个结构

type PACKETHEAD struct {
Type uint16
Size uint16
Hash uint32
}

和一个以某种方式填充了数据的 byte slice

data := make([]byte, 1024)

我的解决方案是

var pkthead PACKETHEAD
pktsiz := unsafe.Sizeof(pkthead)
pktbuf := bytes.NewReader(buf[:pktsiz])
err = binary.Read(pktbuf, binary.BigEndian, &pkthead)
if err != nil {
// handle it
}

但是

  • 它使用不安全

  • 每次转换需要大约 7 行代码(如果我们有数百个不同的数据包会怎么样)

  • 不能简单地打包到 Cast(*struct, data) 函数中

  • 无法控制结构填充,如果 go 的编译器决定在网络一端的成员之间添加额外的字节怎么办?

  • 如果我没记错的话,binary.Read 执行数据复制(这不一定是骗局)


在 C 中,只需在网络两端使用 #pragma pack(1),就一种字节顺序达成一致

最后是 PACKETHEAD* pkt = (PACKETHEAD*)dataptr;

我们如何使用 Go 实现同样的目标?


祝你有美好的一天,克里斯

最佳答案

无耻插件gopack ,我(和其他人)为支持 Go 中的位打包而编写的库。注意:如果这是一个问题,它会在后台使用不安全的操作。

关于networking - 在 Go 中将结构转换为字节 slice 的紧凑方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com