按成员方式发送结构体
C++: Sending a struct memberwise
我想将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字节)
无论如何,你不应该发送(或存储)原始结构体,因为如果你用不同的标志重新编译应用程序,它们可能会改变。最安全的方法总是一个接一个地发送数据成员,然后您可以完全控制接收端的顺序相关文章:
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 如何获取结构体成员的地址
- 访问不同类的私有结构体成员
- C++ 使用成员函数返回结构体指针属性的值
- 通过函数参数确定结构体成员
- 如何使用其他函数返回的值为结构体成员赋值
- 当我想为结构体声明新成员时,有些麻烦我不明白
- CUDA:结构体的共享数据成员和对该结构体的引用成员具有不同的地址和值
- 按结构体的特定成员对结构体数组进行排序
- 如何在编译时输出结构体中成员的偏移量(C/ c++)
- Vector::erase()也擦除结构体的成员向量
- 模板结构体的静态const成员的不同值
- 比较值与结构体成员的问题
- 从二进制文件中提取结构体成员
- 为什么我的结构体成员没有使用"{}"正确初始化?
- 函数参数 -> 结构体成员的 void* 和常量 void* 的解决方案
- 动态结构体成员在使用 CUDA/NVCC 传递到函数时损坏
- 将相同的变量赋给具有不同值的多个结构体成员
- 为什么编译器不能像变量声明那样在结构体成员中设置 char[] = { .. } 的大小?