繁体   English   中英

错误的数据从空指针复制到结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM