1. 初始化
2. 访问与赋值
3. 添加、删除、插入与替换操作
4. 查找与比较
5. 数据转换与处理
访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:
- QByteArray ba;
- ba.resize(6);
- ba[0] = 0x3c;
- ba[1] = 0xb8;
- ba[2] = 0x64;
- ba[3] = 0x18;
- ba[4] = 0xca;
- ba.data()[5] = 0x31;
- qDebug()<<"[]"<<ba[2]; //[] d
- qDebug()<<"at()"<<ba.at(2); //at() d
- qDebug()<<"data()"<<ba.data()[2]; //data() d
- qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
- qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1
从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:
1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;
2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;
3)转为整型、浮点型等数值类型;
4)大小写转换;
5)转为字符串类型;
把Hex编码转换为char存储到QByteArray:
- QByteArray text = QByteArray::fromHex("517420697320677265617421");
- text.data(); // returns "Qt is great!"
把QByteArray转为Hex编码:
- QByteArray ba;
- ba.resize(3);
- ba[0] = 0x30;
- ba[1] = 0x31;
- ba[2] = 0x32;
- qDebug() << ba.toHex(); //return "303132"
尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:
把单个字符转为2-36进制数据格式:
- 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"
按照指定进制格式直接复制,其中n可以是各类常见数值类型:
- QByteArray ba;
- int n = 63;
- ba.setNum(n); // ba == "63"
- ba.setNum(n, 16); // ba == "3f"
把数值按指定格式和小数位转换输出,小数位四舍五入:
- QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
- QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
- qDebug()<<ba1; // returns "1.235E+01"
- qDebug()<<ba2; // returns "12.346"
QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:
- QByteArray strInt("1234");
- bool ok0;
- qDebug() << strInt.toInt(); // return 1234
- qDebug() << strInt.toInt(&ok0,16); // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
-
- QByteArray string("1234.56");
- bool ok1;
- qDebug() << string.toInt(); // return 0, 小数均视为0
- qDebug() << string.toInt(&ok1,16); // return 0, 小数均视为0
- qDebug() << string.toFloat(); // return 1234.56
- qDebug() << string.toDouble(); // return 1234.56
-
- QByteArray str("FF");
- bool ok2;
- qDebug() << str.toInt(&ok2, 16); // return 255, ok2 == true
- qDebug() << str.toInt(&ok2, 10); // return 0, ok == false, 转为十进制失败
QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:
- QByteArray x("Qt by THE QT COMPANY");
- QByteArray y = x.toLower();
- // y == "qt by the qt company"
-
- QByteArray z = x.toUpper();
- // z == "QT BY THE QT COMPANY"
QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符
QByteArray转为QString示例:
- QByteArray ba("abc123");
- QString str = ba;
- //或str.prepend(ba);
- qDebug()<<str ;
- //输出:"abc123"
QString转为QByteArray示例:
- QString str("abc123");
- QByteArray ba = str.toLatin1();
- qDebug()<<ba;
//输出:"abc123"
原文https://blog.csdn.net/ecourse/article/details/80575691