使用Go将struct转换为[] byte

时间:2017-02-06 16:07:14

标签: go tcp

我有一个数据包结构,我希望将其序列化为二进制,以便我可以通过网络发送它。

有很多数据包结构,但我会以登录数据包为例:

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中使用结构并通过网络发送它一样。

2 个答案:

答案 0 :(得分:2)

您的代码中有两个错误。首先,您的结构字段应导出&&以查看它。

其次,encoding/binary表示包含16个字符串的数组,而不是16个字节的字符串。所以你的结构应该是这样的:

[16]string

然后它起作用:https://play.golang.org/p/Nq8fRqgkcp

答案 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)