【发布时间】:2019-05-15 03:23:53
【问题描述】:
我正在用 golang 实现一个网络数据包。它已经在 C++ 中实现。 目的是让 golang 实现的客户端与 C++ 实现的服务器通信。
他们将通过数据包进行通信。数据包结构为:
type Packet struct {
length uint32
nameLen uint8
data []byte
} // in golang
struct Packet {
uint32_t length;
uint8_t nameLen;
byte data[];
} // in C++
它们的下划线结构是字节数组。接收字节数组格式的消息时。我们需要把它翻译成 Packet。
auto p = reinterpret_cast<Packet*>(buffer); // in c++
(buffer's alignment is manually set as 64)
p := (Packet)(unsafe.Pointer(&buffer)) // in golang
为了让它们通信,它们的结构对齐方式应该保持不变。
问题来了: 打印出它们的对齐方式后,我得到了这个:
type Packet struct {
length uint32 // alignment 8
nameLen uint8 // alignment 8
data []byte // alignment 8
}
struct Packet {
uint32_t length; // alignment 4
uint8 nameLen; // alignment 4
data []byte; // alignment 1
}
由于对齐方式不同,他们会以不同的方式解码消息。
我无法更改 C++ 代码。
Q1:有没有办法在golang中设置结构字段对齐方式?
Q2:有没有更好的方法来实现golang Packet,以避免在将缓冲区转换为数据包时避免对齐不匹配?
【问题讨论】:
-
Q2:非常非常肯定。使用
encoding/binary单独解压缩字段,而不是指望一次跨不同语言和架构解压缩整个内容。 -
Q1:不。Q2:是:做一些编程而不是魔术。
-
谢谢你们。我会一一解包。