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技术培训专家
学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!