• 8962阅读
  • 9回复

QByteArray 转unsigned char * 的问题? [复制链接]

上一主题 下一主题
离线dafei2015
 

只看楼主 倒序阅读 楼主  发表于: 2019-05-23
QByteArray ba;    
BYTE *p=reinterpret_cast<unsigned char*>(ba.data(),ba.length());
这样强制转换会存在什么问题?哪位大哥指点下
本帖提到的人: @dbzhang800 @九重水 @dosmlp
离线20091001753

只看该作者 1楼 发表于: 2019-05-24
char *QByteArray::data()
(づ ̄ 3 ̄)づ
离线dafei2015

只看该作者 2楼 发表于: 2019-05-24
回 20091001753 的帖子
20091001753:char *QByteArray::data() (2019-05-24 08:11) 

这个帖子是手敲的,程序里面是有.data();
我这样强制转换成BYTE *,我发现偶尔会出现问题 ,数据会出现不正确
我换成BYTE[ ] 再把QByteArray的东西循环写入BYTE[ ] ,这样数据才能确保每次都正确
所有我不确定是不是强制转换会有问题
离线20091001753

只看该作者 3楼 发表于: 2019-05-24
auto p = ba.data();
(づ ̄ 3 ̄)づ
离线dafei2015

只看该作者 4楼 发表于: 2019-05-24
回 20091001753 的帖子
20091001753:auto p = ba.data(); (2019-05-24 09:25) 

用auto指针还是有问题,函数的参数必须传入BYTE *
离线dafei2015

只看该作者 5楼 发表于: 2019-05-24
回 dafei2015 的帖子
dafei2015:用auto指针还是有问题,函数的参数必须传入BYTE * (2019-05-24 15:26) 

只能用BYTE[]数组才不会有问题, 搞不明白这个强制转换是不是不好使
离线dafei2015

只看该作者 6楼 发表于: 2019-05-24
回 20091001753 的帖子
20091001753:auto p = ba.data(); (2019-05-24 09:25) 

QByteArray ba;      
     BYTE buf[8]={0};
     memcpy((void*)buf,(void*)ba.data(),ba.length());
这个方法可行的
离线fsu0413

只看该作者 7楼 发表于: 2019-05-24
回 dafei2015 的帖子
dafei2015:QByteArray ba;      
     BYTE buf[8]={0};
     memcpy((void*)buf,(void*)ba.data(),ba.length());
这个方法可行的 (2019-05-24 16:28) 

因为QByteArray::data返回的是内部指针,QByteArray没了data就没了,所以如果想保存就要memcpy
1条评分金钱+10
dafei2015 金钱 +10 - 2019-05-25
离线九重水

只看该作者 8楼 发表于: 2019-05-27
这个问题艾特了我呀,不好意思,医生叫我这几天卧床休息(医生说我太突出了……职业病?)一连躺了4天。
言归正传,这个问题的实质是C++浅拷贝和深层拷贝的问题(随便百度一下一堆相关内容)。
如果你一个QByteArray ba变量作为一个临时变量,data()函数返回的是一个指向其数据区的指针,ba变量的生命周期一到,内存被释放。造成原来的数据不正确。
所以,
解决方案一:要保证ba的生命周期比buf的生命周期长;
解决方案二:或者干脆一点,直接将data()指向的数据拷贝过来即可。(也就是你们在上面提到的解决方案。)

离线dafei2015

只看该作者 9楼 发表于: 2019-06-17
回 九重水 的帖子
九重水:这个问题艾特了我呀,不好意思,医生叫我这几天卧床休息(医生说我太突出了……职业病?)一连躺了4天。[表情]
言归正传,这个问题的实质是C++浅拷贝和深层拷贝的问题(随便百度一下一堆相关内容)。
如果你一个QByteArray ba变量作为一个临时变量,data()函数返回的是一个指向 .. (2019-05-27 10:08) 

谢谢啦  注意身体啊  兄dei    
快速回复
限100 字节
 
上一个 下一个