QByteArray在串口通讯中经常被使用
QByteArray类提供了很方便的对字节流操作的接口。可以存储raw bytes和传统的8-bits的字符串,都是以’\0’结尾的,使用比char*更方便,从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:
- 转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;
- 转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;
- 转为整型、浮点型等数值类型;
- 大小写转换;
- 转为字符串类型;
QByteArray与QString区别
- QString是专门用来处理字符串的,除了能处理ASCII编码字符,还包括各国语言的编码,默认情况QString会把所有数据当做utf-8编码来处理。QByteArray只是单纯用来处理数据的,除了能处理ASCII编码字符,其它复杂的编码不能处理(所以汉字不能处理),直接以字节流的方式来对待
QString str("小马哥");
QByteArray byte("小马哥");
qDebug() << "str:" << str << "byte:" << byte << endl;
//str: "小马哥" byte: "\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5"
- str保留编码格式,能输出中文,但是QByteArray只把"小马哥"当做普通的字节数据来处理,utf-8编码下,一个汉字占三个字节。
1、与字符串互转
- QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是QByteArray可以存无法显示的字符,QString只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表。
- QString也可以存储字符串信息,但通常以16-bits形式Unicode方式存储,这有利于非ASCII和非Latin-1格式的数据的存储
QByteArray转为QString:
QByteArray ba("123abc小马哥");
QString str = ba;
qDebug()<<"str:"<<str<<"ba:"<<ba ;
//输出:str:"123abc小马哥" ba:"123abc\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5"
QString转为QByteArray:
QString str("123abc小马哥");
QByteArray byte1 = str.toLatin1(); //按照ASCII编码转换,无法转换中文
QByteArray byte2 = str.toUtf8(); //按照Utf-8编码转换,可以转换中文
qDebug() << "byte1:" << byte1 << "byte2:" << byte2;
//byte1: "123abc???" byte2: "123abc\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5"
2、字符串数值转为各类数值
- QByteArray若为字符串数值,可通过to的方法转为各种类型数据
QByteArray string("1234.56");
qDebug() << string.toInt();
Debug() << string.toFloat();
qDebug() << string.toDouble();
3、数值转换与输出
- 尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位四舍五入的数值
int n = 63;
qDebug()<<QByteArray::number(n); // returns "63"
qDebug()<<QByteArray::number(n, 16); // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F"
qDebug()<<QByteArray::number(n, 2); // returns "111111"
qDebug()<<QByteArray::number(n, 8); // returns "77"
QByteArray::number(12.3456, 'f', 3); // returns "12.346"
4、Hex转换
- 把Hex编码转换为char存储到QByteArray,因为大多HEX码是没有字符显示的,如0x00、0x20等等;
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // returns "Qt is great!"
5、大小写转换
- QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换