我有一个像下面这样的打包结构
struct MyStruct
{
uint8_t a;
uint32_t b;
uint16_t c;
uint8_t d[4];
uint16_t e[2];
uint32_t crc_field;
} __attribute__((packed));
我想以串行方式将数据存储到它,这意味着我想使用memcpy
或for
循环将数据从数组复制到上面的结构体中。
请看下面的例子:
uint8_t Buffer[64]; //We assume it contains some data.
MyStruct foo;
memcpy(&foo, Buffer, sizeof(MyStruct));
假设我总是检查crc_field
,并且Buffer
中的数据以相反的方式存储(从之前的另一个MyStruct
到Buffer
)。这种方法会有任何问题吗?
用一个联合体来代替会更好吗?
union MyUnion
{
uint8_t raw_data[19];
struct MyStruct
{
uint8_t a;
uint32_t b;
uint16_t c;
uint8_t d[4];
uint16_t e[2];
uint32_t crc_field;
} __attribute__((packed));
}
uint8_t Buffer[64]; //We assume it contains some data.
MyUnion foo;
memcpy(foo.raw_data, Buffer, sizeof(MyStruct));
1条答案
按热度按时间yftpprvb1#
MyStruct
类是可复制的。这意味着你可以安全地将它的字节表示复制到缓冲区中,当你将该表示复制回MyStruct
对象时,该对象将采用原始值。这里不需要联合。简单地说,由于标准中没有定义标量类型的表示,因此使用该表示在使用不同选项编译的不同系统或应用程序之间交换数据可能会调用未定义行为。如果编译器记录了标准类型和结构表示形式(可能是因为你使用的是非标准的
__attribute__((packed))
)。简单地说,它被限制在一个环境中,不再是一个可移植的C++程序...