我正在使用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++
它们的底层结构是字节数组。当以字节数组格式接收消息时,我们需要将其转换为数据包。
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,以避免将缓冲区转换为数据包时出现对齐不匹配的情况?
encoding/binary
逐个拆分字段,而不是依赖于在不同语言和架构之间一次性解包整个内容。 - Adrian