[英]Wrong data copied to struct from void pointer
好的,所以我用光了一些东西来尝试解决此问题。
我有一个结构如下:
typedef struct
{
u8int NodeType;
u32int Group;
u32int Direction;
u16int ID;
} tsTargetNode;
void vTrackNode(const uint8 *pu8Val, uint8 u8Len, void *pvCbData)
{
/* Copy data */
memcpy(pvCbData, pu8Val, u8Len);
/* Doing this gives the wrong data */
//tsTargetNode *node = (tsTargetNode *) pvCbData;
/* Doing this gives the right data */
memcpy(&tsTargetNode.NodeType, pvCbData, 1);
memcpy(&tsTargetNode.Group, pvCbData+1, 4);
memcpy(&tsTargetNode.Direction, pvCbData+1+4, 4);
memcpy(&tsTargetNode.ID, pvCbData+1+4+4, 2);
}
例如:传递的数据* pu8Val = 0x AA BB CC DD EE FF 11 22 33 44 55 66 77 88 99 00
使用指针,我检索的数据是:
NodeType = 0xAA
Group = 0xFF112233
Direction = 0x44556677
ID = 0x8899
但是手动memcpy,我检索的数据是正确的
NodeType = 0xAA
Group = 0xBBCCDDEE
Direction = 0xFF112233
ID = 0x4455
似乎是第一组尝试将4个字节复制到NodeType中。
我做的指针复制错误吗? 还是这可能是设备/硬件问题?
编译器可以自由地在结构的成员之间添加填充,以使每个成员都与平台的自然对齐-在这里,它看起来像32位。 尝试打印sizeof(tsTargetNode)
,并从初始化的tsTargetNode
转储那么多字节,以查看字段的布局。
您尚未说明正在使用什么编译器,但是将有一种特定于编译器的方式来禁用结构的填充。 如果这样做,其内存布局将与缓冲区匹配。
您需要告诉编译器“打包”该结构:
typedef struct __attribute__((__packed__))
{
u8int NodeType;
u32int Group;
u32int Direction;
u16int ID;
} tsTargetNode;
https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Type-Attributes.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.