在C++中以串行方式将数据复制到结构

r1zhe5dt  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(107)

我有一个像下面这样的打包结构

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));

我想以串行方式将数据存储到它,这意味着我想使用memcpyfor循环将数据从数组复制到上面的结构体中。
请看下面的例子:

uint8_t Buffer[64]; //We assume it contains some data.
MyStruct foo; 
memcpy(&foo, Buffer, sizeof(MyStruct));

假设我总是检查crc_field,并且Buffer中的数据以相反的方式存储(从之前的另一个MyStructBuffer)。这种方法会有任何问题吗?
用一个联合体来代替会更好吗?

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));
yftpprvb

yftpprvb1#

MyStruct类是可复制的。这意味着你可以安全地将它的字节表示复制到缓冲区中,当你将该表示复制回MyStruct对象时,该对象将采用原始值。这里不需要联合。
简单地说,由于标准中没有定义标量类型的表示,因此使用该表示在使用不同选项编译的不同系统或应用程序之间交换数据可能会调用未定义行为。如果编译器记录了标准类型和结构表示形式(可能是因为你使用的是非标准的__attribute__((packed)))。简单地说,它被限制在一个环境中,不再是一个可移植的C++程序...

相关问题