最近因为项目需求,涉及到串口接收数据后解析数据问题,使用自己写的串口调试助手以及两个 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技术培训专家
学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!
文章浏览阅读4.8k次,点赞2次,收藏7次。问题描述: Antd中新建一个表格后,默认只添加了鼠标经过事件,即:鼠标经过表格的每一行时,那一行就会添加一个淡色的背景。但是现在有需求,要给表格添加一个点击事件,就是在点击每一行时,也会添加一个背景效果。解决方法: 查看Antd的官网文档可以发现,表格有rowClassName和onRow两个属性,我们通过这两个属性来实现表格的点击添加背景色效果。..._table中oncell怎么设置表体单元格属性点击换背景颜色react
文章浏览阅读499次。UVM基础_芯片验证计划编写
文章浏览阅读602次。原文 http://www.cnblogs.com/lyricgan88/p/3361383.html在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装成名为WebView的组件。WebView使用:(1)添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page _android webview l
文章浏览阅读2k次。Jenkins报错:Build step 'Execute shell' marked build as failureERROR: Maven JVM terminated unexpectedly with exit code 1Finished: FAILURE[root@localhost bin]# free -m total used free shared buff/cache availableMem: _maven jvm terminated unexpectedly with exit code 1
文章浏览阅读3.4k次。libclntsh.so: cannot open shared object file: No such file or directory_cannot locate a 64-bit oracle client library
文章浏览阅读4.1w次,点赞14次,收藏96次。操作系统操作系统的特点?– 共享:资源可被多个并发执行的进程使用– 并发:可以在同一时间间隔处理多个进程,需要硬件支持– 虚拟:将物理实体映射成为多个虚拟设备– 异步:进程执行走走停停,每次进程执行速度可能不同,但OS需保证进程每次执行结果相同进程的三个组成部分?程序段、数据段、PCB(Process Control Block)并发与并行区别?并发:同一间隔 并行:同一时刻进程切换的过程?保持处理机上下文 -> 更新PCB -> 把PCB移入相应队列(就绪、阻塞) -&g_中断解决处理器速度和硬件不匹配
文章浏览阅读311次。1. 我们可以通过渐变来实现复杂的背景颜色,实现从一个颜色向另一个颜色过渡的效果注意:渐变是图片,需要通过background-image来设置2.线性渐变:linear-gradient,颜色沿着一条直线发生变化用法:background-image:linear-gradient(渐变方向,渐变颜色1,渐变颜色2),可同时设置多个渐变颜色,多个颜色默认情况下平均分布在线性渐变开始部分可以指定渐变的方向:to top、 to bottom(渐变方向为向下渐变,也是默认方向..._background-image径向渐变
文章浏览阅读5.4k次,点赞6次,收藏19次。本文介绍了PCL法线估计并可视化的方法,同时给出了OpenMP加速法线估计。_pcl 计算点云法向量并展示
文章浏览阅读4.1k次,点赞23次,收藏30次。任何指向“类”的成员函数指针,由于携带额外的所属对象信息,与一般的函数有根本的不同,不能直接用来进行函数调用。用C++ 描述:对于类class MyClass 中的成员函数 void Method(); ,它的函数类型为void (MyClass::*f)(); 而不是void (*f)(); 。_类指针调用成员函数
文章浏览阅读1.1w次,点赞8次,收藏23次。在setting设置中开启NFC功能,在NFC开启过程中进行的流程_nfc代码启动分析
文章浏览阅读3.9k次,点赞2次,收藏11次。 可以再次下载 :Odoo 销售扫码很多人都说从9.0 之后,很多社区版功能被阉割了,比如大家常说的仓库条码扫码模块就没有了。 但是却为我们留下了bcarcode模块,方便我们进行扩展。由于有需求,需要为采购模块增加条码扫码功能,代码如下:1.需要在purchase.order.line 增加product_barcode字段,关联自产品资料的bcarcode:class Purch..._odoo 费用报销 扫描 单据要求
文章浏览阅读1.7k次。本文来自http://blog.csdn.net/runaying ,引用必须注明出处!cocos2d-X 节点(CCTMXObjectGroup.h)API//cocos2d-x-3.0alpha0/cocos2dx/tilemap_parallax_nodes/#ifndef __CCTMX_OBJECT_GROUP_H__#define __CCTMX_OBJECT_GRO_tmxobjectgroup