• 10971阅读
  • 15回复

[提问]数组到QString的转换 [复制链接]

上一主题 下一主题
离线hellotk
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-22
大家好:
       在写一个串口程序的接收部分,不使用第三方类,把接收到的数据显示到一个label上
具体想法是调用read函数:
read(fd, buf,SIZE)
然后把buf里面的数据转换成QString,之后调用setText显示,
转换的方式为:
QString temp=QString::fromLocal8Bit(buf, size)
或者:
QString temp = QString(QLatin1String(buf))
但是在调试的时候无论哪种方法temp都是空字符串,求解答,谢谢
或者大家谁还有好的读串口的实现方法希望介绍给小弟,谢谢!
离线jdwx

只看该作者 1楼 发表于: 2011-03-22
首先你要确定buf是由\0结尾的字符串,直接用ui->LineEdit->setText(buf);
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线hellotk

只看该作者 2楼 发表于: 2011-03-22
buf是个缓冲区,我希望把他转换成QString的字符串temp,但是debug的时候调试器看到的temp是个空串,我试过很多方法,都是空串,不知道为什么
离线wxj120bw

只看该作者 3楼 发表于: 2011-03-23
楼主试下从char -> QByteArray -> QString 方式解决
离线梅克斯
只看该作者 4楼 发表于: 2011-03-23
先确定读取到的buf是有数据的
离线hellotk

只看该作者 5楼 发表于: 2011-03-23
回 3楼(wxj120bw) 的帖子
试过了,后来为了确定buf有没有读到数据的问题我后来直接定义了一个char数组,自己赋值
char a[]={1,2,3,4};
QByteArry array(a);
QString temp=array.data();
发现还是不行,真的是很纳闷啊
离线hellotk

只看该作者 6楼 发表于: 2011-03-23
回 4楼(梅克斯) 的帖子
我试的时候,为了排除buf没有数据的意外情况,干脆就直接定义了数组以充当“buf”
char a[]={1,2,3,4};把这个数组就当做buf,
我试过直接用QString的构造函数QString temp(a);
还试过上面的方法,还包括从QByteArray再到QString
到最后label->setText(temp)的时候就是一片空白,调试的时候看temp是空串

离线wxj120bw

只看该作者 7楼 发表于: 2011-03-23
那样的数组很难转换成QString变量,这有这样数组向下才可以转换
char a[5] = "122";
QByteArray array(a, strlen(a) + 1);
QString temp= QString::fromUtf8(a);
离线hellotk

只看该作者 8楼 发表于: 2011-03-23
回 7楼(wxj120bw) 的帖子
果然有用,能否解释一下为什么呢?
具体结合我的读串口的例子,用read函数:
read(fd,buf,size);
这个buf就是一个数组,就像我定义的那个 样子,跟字符串格式(“122”)是不一样的,我该怎么做呢?
离线梅克斯
只看该作者 9楼 发表于: 2011-03-23
ASCII码的1,2,3,4都是不可见字符......你设置了当然看不见....
离线hellotk

只看该作者 10楼 发表于: 2011-03-23
回 9楼(梅克斯) 的帖子
那比如我的数组里正好会出现一串数字,里面含有1,2,3,4,那我该怎么办呢?
离线梅克斯
只看该作者 11楼 发表于: 2011-03-23
是ASCII码的1234的话就是显示不出来,其他可见字符应该可以显示
离线hellotk

只看该作者 12楼 发表于: 2011-03-23
如果是:
char a[]="1234567890";
QString temp=QString::fromLocal8Bit(a,10);
就没有问题,但如果是
char a[]={1,2,3,4,5,6,7,8,9,0};
QString temp=QString::fromLocal8Bit(a,10);
就不行
我估计第一种写法,编译器在调用QString::fromLocal8Bit的时候把每一个数据认成一个“char”
而第二种写法,编译器在调用QString::fromLocal8Bit的时候把每一个数据认成一个ascii码。
ascii码从0到9是非打印字符,显示不出来
不知道我的read函数里面的第二个参数buf是按照哪种方式存进去的……
离线dbzhang800

只看该作者 13楼 发表于: 2011-03-23
引用第12楼hellotk于2011-03-23 15:09发表的  :
如果是:
char a[]="1234567890";
QString temp=QString::fromLocal8Bit(a,10);
就没有问题,但如果是
char a[]={1,2,3,4,5,6,7,8,9,0};
QString temp=QString::fromLocal8Bit(a,10);
就不行
我估计第一种写法,编译器在调用QString::fromLocal8Bit的时候把每一个数据认成一个“char”
而第二种写法,编译器在调用QString::fromLocal8Bit的时候把每一个数据认成一个ascii码。

ascii码从0到9是非打印字符,显示不出来
不知道我的read函数里面的第二个参数buf是按照哪种方式存进去的……


结论错误。

这个东西和fromLocal8Bit没什么关系,问题出在你对
char a[]="12";
char a[]={1,2};
char a[]="\x01\x02";
char a[]={'1','2'};
char a[]="\x01\x02";
char a[]="\x31\x32";
char a[]={'1','2','\0'};
....

等等写法的理解上

所以,你可能需要补充点C的基础知识
离线wxj120bw

只看该作者 14楼 发表于: 2011-03-23
Re:回 7楼(wxj120bw) 的帖子
引用第8楼hellotk于2011-03-23 13:48发表的 回 7楼(wxj120bw) 的帖子 :
果然有用,能否解释一下为什么呢?
具体结合我的读串口的例子,用read函数:
read(fd,buf,size);
这个buf就是一个数组,就像我定义的那个 样子,跟字符串格式(“122”)是不一样的,我该怎么做呢?

read函数读取的内容存放在字符数据buf里,而这个数组不应该像你描述那样,如{1,2,3},这个是整形数组。所以你接受到的内容应该是“1,2,3”这是字符串或者字符数组。
离线hellotk

只看该作者 15楼 发表于: 2011-03-23
明白了,我的问题就是没有意识到数值常量跟字符常量的区别,谢谢楼上二位的解答!
快速回复
限100 字节
 
上一个 下一个