QByteArray字节流和二进制与字符的关系以及tohex() toLatin1

118 篇文章 7 订阅

QByteArray字节流和二进制与字符的关系以及tohex() toLatin1

----------------------------------------------

参考:

Qt 数据类型转换 汇总 (**)  https://blog.csdn.net/ken2232/article/details/131285826

1,QChar 转换char:

char QChar::toLatin1();

char QChar::toAscii();

2, Char转QChar:

QChar(char ch);

===================================

QByteArray字节流和二进制与字符的关系以及tohex() toLatin1

QByteArray

存储的是字节,二进制形式,即ascii码的二进制编码。输出的时候,会输出二进制对应的字符

即一个映射:
二进制到ascii码的映射

而.tohex()会将二进制转化为16进制字符,这里的16进制字符又是作为值域了,实际存储二进制编码已经变

QByteArray array("abcdefghijklmn");
        QByteArray b=array.toHex();
        qDebug()<<array;
        qDebug()<<b;
        qDebug()<<b[0]<<b[1]<<b[2]<<b[3]-'0';

 结果:

"abcdefghijklmn"
"6162636465666768696a6b6c6d6e"
6 1 6 2 //前3个是字符,最后一个是数字,说明,底层存的是16进制字符对应的二进制编码

例如:

QByteArray array("abc");
        qDebug()<<array;
        qDebug()<<array.toHex();

输出:

"abc"
"616263" //a的16进制编码就是61

QString

string中保存的每个单位是char类型
str[i]到str[i].toLatin1()的区别就是Qchar和Byte(char)的区别
即从unicode16位编码(QChar)转化为ascii8位编码(char)  // QChar与 char的区别
做这个转化是因为串口的write函数放送的只能是Byte(char)型数据

hstr=str[i].toAscii();//qt4

hstr=str[i].toLatin1();//qt5

测试代码:

QString str("love");
        qDebug()<<str[0]<<str[1]<<str[2].toLatin1();

结果:

'l' 'o' v //这里的v仍然是一个字符,只不过是Byte型

 

QChar

QString 的str[i]类型为QChar,大小为2字节,保存的是16位的unicode编码

The QChar class provides a 16-bit Unicode character.

str[i]返回的是一个QChar字符的应用,大小为2字节

QCharRef QString::operator[](int position)
Returns the character at the specified position in the string as a modifiable reference.

Example:

QString str;

if (str[0] == QChar('?'))
    str[0] = QChar('_');
The return value is of type QCharRef, a helper class for QString. When you get an object of type QCharRef, you can use it as if it were a QChar &. If you assign to it, the assignment will apply to the character in the QString from which you got the reference.

串口收发数据的16进制的含义

可能不同的串口软件有不同的含义

比如下面这个软件,16进制发送就只是在发送端的显示层将字符串转换为16进制,发的是同一个东西,16进制接收就是在接收端显示层将字符串转换为16进制字符串。

 

对于另一个串口助手来说

1.发数据

正常发送就是发送输入的字符串,
16进制发送就是在发送前在发送端将原字符串转换为16进制字符串发出去
16进制发送是以发送字符串作为16进制编码,而不是发字符串的16进制编码。(就是说我发送框输入的当成是16进制编码,发送时(每两个字符当成一个字节)转换为对应的字节流)

2.收数据

正常接收就是将收到的字节流转为字符串显示出来
16进制接收就是在接收端先将收到的字节流转换为16进制只对应的字节流再转换为字符串显示出来

总结

一、收
收正常:字节流对应的字符串
收16进制:字节流的16进制对应字符串

二、发
发正常:字符串对应的字节流
发16进制:字符串作为16进制对应的字节流

 


————————————————
版权声明:本文为CSDN博主「wow_awsl_qwq」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42641977/article/details/128761237

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值