按成员方式发送结构体

C++: Sending a struct memberwise

本文关键字:结构体 成员方      更新时间:2023-10-16

我想将struct sMessage一个字节一个字节地从一个微控制器发送到另一个微控制器:

typedef struct {
    unsigned char mu8MessageId; 
    unsigned char mu8MessageSenderId; 
    unsigned char mu8MessageReceiverId; 
    unsigned short mu16MessageSizePayload; 
    unsigned short mu16MessageSizeTotal;
} sMessage;
sMessage msMessage;
因此我使用了一个简单的函数
MSGSENDER_vSend(void* pvMessage, unsigned short u16Size) 

接受一个void指针和要发送的数据的大小。在接收端,我一个字节一个字节地接收发送的数据,并从中重建发送的数据。我在两个设备上有相同的字节顺序。不幸的是,如果我

,我收到的字节顺序就不同了
    使用结构体msMessage及其大小作为参数(字节顺序似乎是正确的)调用此函数一次
MSGSENDER_vSend(&msMessage, sizeof(msMessage))
  • 为结构体的每个成员(字节顺序不正确)调用此函数
MSGSENDER_vSend(&msMessage.mu8MessageId, sizeof(msMessage.mu8MessageId))
MSGSENDER_vSend(&msMessage.mu8MessageSenderId, sizeof(msMessage.mu8MessageSenderId))
//...

为什么字节以不同的顺序发送?

根据编译器和编译标志的不同,结构体中的成员之间可能存在"间隙"。如果它针对速度进行了优化,那么它就有可能尝试根据最大的成员类型来对齐成员。在你的例子中,你使用了3个1字节的成员和2个2字节的成员,并且可以在最后一个字符和第一个短字符之间插入1字节的void,所以短字符是由两个对齐的(因为它是2字节)

无论如何,你不应该发送(或存储)原始结构体,因为如果你用不同的标志重新编译应用程序,它们可能会改变。最安全的方法总是一个接一个地发送数据成员,然后您可以完全控制接收端的顺序