我有一个数据包结构,我希望将其序列化为二进制,以便我可以通过网络发送它。
有很多数据包结构,但我会以登录数据包为例:
login struct {
seq uint8
id uint16
username [16]string
password [16]string
unknown1 [16]byte
}
我已经在某处读过你不能将binary.Write
用于非固定大小的结构。但我相信我的结构是固定的大小(如果我错了,请纠正我,我可能会非常错误。)
现在使用此代码:
var buf bytes.Buffer
x := login{
seq: 2,
id: 1,
username: [16]string{"username"},
password: [16]string{"password"},
}
err := binary.Write(&buf, binary.LittleEndian, x)
if err != nil {
log.Fatalln(err)
}
给我错误:binary.Write: invalid type main.login
现在,有没有办法解决这个问题?有替代方法吗?就像你如何在C中使用结构并通过网络发送它一样。
答案 0 :(得分:2)
您的代码中有两个错误。首先,您的结构字段应导出&&
以查看它。
其次,encoding/binary
表示包含16个字符串的数组,而不是16个字节的字符串。所以你的结构应该是这样的:
[16]string
答案 1 :(得分:1)
您可以使用unsafe
包来完成此操作。
type test struct {
a int
s string
}
v1 := test{
a: 5,
s: "sdaf",
}
fmt.Printf("v1: %#v\n", v1)
b := *(*[unsafe.Sizeof(v1)]byte)(unsafe.Pointer(&v1))
fmt.Printf("bytes: %#v\n", b)
v2 := *(*test)(unsafe.Pointer(&b))
fmt.Printf("v2: %#v\n", v2)