网站开发建设挣钱吗,网站设计哪个好,自己建立的网站,旅游网站策划书模板QString 转 char * 乱码出错
问题描述
最近因为项目需求#xff0c;涉及到串口接收数据后解析数据问题#xff0c;使用自己写的串口调试助手以及两个 RS485 模拟的数据收发#xff0c;已测试过两线 RS485 无法自发自收#xff0c;需要两个相互收发才行#xff0c;在网上…QString 转 char * 乱码出错
问题描述
最近因为项目需求涉及到串口接收数据后解析数据问题使用自己写的串口调试助手以及两个 RS485 模拟的数据收发已测试过两线 RS485 无法自发自收需要两个相互收发才行在网上也查阅了相关资料说的是两线 RS485 是通过差分信号进行数据收发属于半双工通信得用四线才行先不纠结这个问题下面来说一下数据类型转换乱码出错的问题出错的代码如下
QSrting str XXXXX;
char *arr str.toLocal8Bit().data();以上代码时而正常时而出错调试的时候偶尔也是这样。
解决方案
这代码逻辑很难看出有啥问题但是他确实存在问题简单的 QString 转 char * 得先通过 toLocal8Bit() 方法转 QByteArray 然后再通过 QByteArray 的 data() 方法转 char *转换的逻辑和流程确实没有问题但是它存在编译逻辑问题 这个问题使用QT creator调试一下代码就可以发现为什么有问题了。 当然直接观察反汇编代码可能更加直观。 根本原因在于这几种代码形式中QByteArray::~QByteArray() 和 operator() 的执行次序不同。如果先 operator() 后执行 QByteArray::~QByteArray() 就没问题反过来的次序就有问题。 上面是一位叫做QT技术培训专家大佬的回答还附有一张代码图片这里就不用图片了容易失效这里小编就用代码来写一次代码及注释如下
{QString s hello world;qDebug() s;//执行 QByteArray toUtf8() const //执行 operator()//执行 QByteArray::~QByteArray()qDebug() s.toUtf8().data();//执行 QByteArray toUtf8() const //执行 QByteArray::~QByteArray()//执行 operator()//p 指向的数据所在内存已经释放掉了char *p s.toUtf8().data();qDebug() p;//执行 QByteArray toUtf8() const //执行 operator()//执行 QByteArray::~QByteArray()QByteArray b s.toUtf8();p b.data();qDebug() p;
}这里纠正一下p 指向的数据所在内存已经释放掉了 应该还是有点问题因为我调试的时候它偶尔也是正常的已经释放掉了存在概率性问题比较幸运的时候它是没有被释放的能够正确打印数据。
参考 Qt QString转char* 为什么乱码?-QT技术培训专家
学习分享一起成长以上为小编的经验分享若存在不当之处请批评指正