综合技术
直播中

tijing忽忽

7年用户 221经验值
私信 关注
[问答]

为什么我在pData位置无法得到数据?

[C] 纯文本查看 复制代码
#pragma pack(1)typedef struct CardInfo{unsigned char Card[5];}CARD_INFO,*pCARD_INFO;typedef struct PackInfo{charSyncHead[4];void*pData;unsigned shortCrcValue;}PACK_INFO,*pPACK_INFO;#pragma pack()pPACK_INFO PACK_A;CARD_INFO PACK_B;//现在想,PACK_A  里面的pData位置填上PACK_B的实际数据unsigned short len;//结构体 PACK_A 在填了数据之后的最终长度搞了好久了没搞明白。在这个pData位置我一直是取得地址,但是没有得到数据。。已经蒙了。

回帖(10)

余煌木

2019-11-6 07:51:52
void*型就是空指针,你爱指啥指啥,需要得到的数据只需要取地址然后强转成void* 型就OK 万事大吉!这种方法在linux底层驱动和内核中非常常见!
举报

李云

2019-11-6 07:57:43
木有人看一下嘛
举报

王英

2019-11-6 08:06:43
         这个是一种数据流的处理办法。网络传输数据包用的比较多。SyncHead这个是包头,后面定义成void类型可扩展性好,最后应该是个crc校验。因为这段报文长度实际不知道的。需要填充后得到。我举个例子吧,我组装了两个数据包pack1 pack2  。*pdata的len是4和6,地址分别取自data1和data2两个数组那么形式如下。         uint32_t  data1[4] = {xxx1  xxx2  xxx3  xxx4  };   
         uint32_t  data2[6] = {xxx1  xxx2  xxx3  xxx4  xxx5  xxx6 };
         数据包是这样:
           SyncHead               void   *pdata                                                               crc
pack1: 0000                     xxx1  xxx2  xxx3  xxx4                                                3745
pack2: 0001                     xxx1  xxx2  xxx3  xxx4  xxx5  xxx6                               5251
          你这个时候取padata->pdata指向就是  32位数组data1或者data2了。但是此时你的结构体的指针是void类型的所以你要转下指针类型才能得到数据。比如你要得到data1[2]数据就要这么写。
           ((uint32_t *)&(padata->pdata) +2)  
           大概就是这样的。
          其实c语言里面像memcpy这样的内存拷贝函数都是void *定义指针的,楼主可以看看。
举报

王琴

2019-11-6 08:22:06
不是这样吧,((uint32_t *)&(padata->pdata) +2) , 你这个不是应该是先&取得pdata的地址,而这个pdata本来是一个指针,你&这个指针是获得的是指针变量的地址吧。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分