假设我有一个包含位字段的typedef,如下所示。
typedef struct VIN_oCAN01_3abd61be
{
uint64_t var1:24;
uint64_t var2:4;
uint64_t var3:4
}__attribute__((packed))Message;
我收到了如下的 uint8_t
缓冲区。
uint8_t buffer[4] = {0x1,0x2,0x3,0x14};
目前在我的生产程序中,我的团队建议采用以下方法。
Message *ptrMsg = (Message *)buffer;
也就是说,将
uint8_t
缓冲区分配给Message
类型指针。
我建议采用下面的方式,因为这种方法不遵循严格别名规则。Message msg;
memcpy(&msg,buffer, sizeof(msg));
请注意,没有手动将缓冲区复制到结构体的选项(逐个成员), 因为结构体非常大。
我的理解正确吗?如果是这样,请提供我可以用来证明我的观点的标准文档。
memcpy
或指针赋值之前处理了字节序,只是这里没有展示出来。 - kiran Biradaruint8_t buffer[4]
太小,无法容纳uint64_t
。 - user694733uint64_t
中。你不知道这64位中的位域实际上在哪里。根据6.7.2.1p11:“一个不适合的位域是否放入下一个单元或重叠相邻单元是由实现定义的。位域在单元内的分配顺序(高位到低位或低位到高位)是由实现定义的。可寻址存储单元的对齐方式是未指定的。” 位域对于可移植性和可维护性来说只会带来麻烦。 - Andrew Henle