一、基本操作
1、访问与赋值
访问QByteArray主要有4种方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:
QByteArray ba;
ba.resize(1);
方式1 ba[0] = 0x3c;
方式2 ba.data()[0] = 0x31;
方式3 ba.at(0) //只读
方式4 ba.constData()[0] //只读
2、数据转换
QByteArray与char、int、float、QString
QByteArray转char*
方式1 传统方式data()和size()函数 (方便)
QByteArray array(10, 'Q');//初始化
char *buf = array.data();
int len = array.size();
方式2 使用memcpy()方式 (灵活)
QByteArray array(9,'Q');
char buf[10];//数组
int len_array = array.size();
int len_buf = sizeof(buf);
int len = qMin( len_array, len_buf );
// 转化
memcpy( buf, array, len );
QByteArray转int
QByteArray strInt("1234");
strInt.toInt(); // return 1234
strInt.toInt(&ok0,16); // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
QByteArray转float、double
QByteArray string("12.5");
string.toFloat(); // return 12.5
string.toDouble(); // return 12.5
QByteArray转为Hex字符形式16进制
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
ba.toHex(); //return "303132"
ba.toHex().toInt(&ok0,16); //return 303132
QByteArray与QString字符串互转
QByteArray ba("abc123");
QString str = ba;
char、int、float、QString转QByteArray
QString转QByteArray
QString str("abc123");
QByteArray ba = str.toLatin1();
char、int、float转QByteArray
QByteArray byte_head,byte_data;
byte_head.resize(4);
byte_data.resize(4);
memcpy(byte_head.data(),&int_head,sizeof(int_head));
memcpy(byte_data.data(),&int_data,sizeof(int_data));
或
int n = 63;
QByteArray::number(n); // returns "63"
QByteArray::number(n, 16); // returns "3f"
QByteArray::number(n, 16).toUpper(); // returns "3F"
或
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
二、QByteArray类函数
1、大小写 toLower、toUpper
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"
2、获取大小、数据、数组大小data()、size()、resize()
QByteArray array(10, 'Q');//初始化
char *buf = array.data();
int len = array.size();
array.readAll()//串口通讯中接收所有数据
array.resize()设置数组的大小,并初始化每个字节的数据字节
3、向前、向后追加、替换字符
QByteArray x("and");
x.prepend("rock "); // x == "rock and" 前置
x.append(" roll"); // x == "rock and roll" 附加
x.replace(5, 3, "&"); // x == "rock & roll" 替代
4、提取多个字节 使用 left(),right() 或mid()
left:取字符串左侧4位
QByteArray x("Pineapple");
QByteArray y = x.left(4); // y == "Pine"
right:取字符串右侧3位
QByteArray x("Pineapple");
QByteArray y = x.right(3); // y == "ple"
mid:从第1 个后截取后面3个字符:
QByteArray x("Pineapple");
QByteArray y = x.mid(1,3); // y == "ine"
5、查找QByteArray中特定字符或子字符串的所有出现,使用indexOf()、lastIndexOf()
向前搜索indexOf
向后搜索lastIndexOf
返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1
QByteArray x("sticky question");
QByteArray y("sti");
x.indexOf(y); // returns 0
x.indexOf(y, 1); // returns 10
x.indexOf(y, 10); // returns 10
x.indexOf(y, 11); // returns -1
6、检测是否包含字串contains
存在字符返回true,否则返回false
QByteArray s("array");
bool b = s .contains("arr",) //true
7、将所有字符重置为某个数fill()
类似c语音memset
QByteArray array;
先设置大小 array.resize(5) //初始化5个字节
fill('0',5) // "00000"
8、检测是否为空isEmpty、isNull如果字节数组的大小为0,返回true; 否则返回false。
QByteArray().isNull(); // returns true
QByteArray().isEmpty(); // returns true
QByteArray("").isNull(); // returns false
QByteArray("").isEmpty(); // returns true
QByteArray("abc").isNull(); // returns false
QByteArray("abc").isEmpty(); // returns false