QByteArray
一、用途
QByteArray用来存储原始char类型数据。Qt中QString等类型数据内部都是通过QChar存储,所以通过.data()返回的数据都是QChar。
注意:把char类型数据存入QByteArray类型数据时,char数据需要以'\0'结尾。
二、常用功能
2.1char类型QByteArray类型数据交互
2.1.1char数据写入QByteArray
QByteArray存入数据支持的数据类型:
1 QByteArray & append(const QByteArray &ba) 2 QByteArray & append(int count, char ch) 3 QByteArray & append(const char *str) 4 QByteArray & append(const char *str, int len) 5 QByteArray & append(char ch) 6 QByteArray & append(const QString &str) 7
从结束位置开始追加:append方法使用方法:
- 方法1:直接append方法追加数据,然后调用resize方法设置QByteArray数据大小;
- 方法2:先调用resize方法设置QByteArray数据大小,然后用memcpy函数把源数据拷贝到QByteAarray变量内存。
1 QByteArray tmp; 2 QString myStr("abc"); 3 4 tmp.append(myStr); //tmp存储“abc” 5 6 /////////////////////////// 7 char cdata[] = { 1,2,3,4,5 }; 8 QByteArray myTmp; 9 //cSize是5 10 int cSize = sizeof(cdata); 11 //cSize是1 12 //cSize = sizeof(*cdata); 13 myTmp.resize(sizeof(cdata)+1); 14 15 //此时数据会从第七个位置开始追加数据 16 //myTmp.append(cdata,sizeof(cdata)+1); 17 memcpy(myTmp.data(),cdata,sizeof(cdata));
从起始位置插入数据:preppend
replace是修改的原始数据
1 QByteArray x("and"); 2 x.prepend("rock "); // x == "rock and" 3 x.append(" roll"); // x == "rock and roll" 4 x.replace(5, 3, "&"); // x == "rock & roll"
2.1.2QByteArray数据中读取char数据
1 /////////////////////////// 2 char cdata[] = { 1,2,3,4,5 }; 3 QByteArray myTmp; 4 //cSize是5 5 int cSize = sizeof(cdata); 6 //cSize是1 7 //cSize = sizeof(*cdata); 8 myTmp.resize(sizeof(cdata)+1); 9 10 //此时数据会从第七个位置开始追加数据 11 //myTmp.append(cdata,sizeof(cdata)+1); 12 memcpy(myTmp.data(),cdata,sizeof(cdata)); 13 char cArra[6]; 14 memcpy(cArra,myTmp.data(),myTmp.size()); 15
2.1.3QByteArray内容是否为空
isNull:根据QByteArray的变量数据内容,如果该字节数组为空,则返回true;否则返回false。,
isEmpty:根据QByteArray的size返回大小返回true/false,size为0则返回true。
1 bool res(false); 2 res = QByteArray().isNull(); // returns true 3 res = QByteArray("").isNull(); // returns false 4 res = QByteArray("").isEmpty(); // return true 5 res = QByteArray("abc").isNull(); // returns false
1 bool res(false); 2 QByteArray array; 3 res = array.isNull(); //res:true 4 res = array.isEmpty(); //res:true 5 array.resize(10); 6 res = array.isNull(); //res:false 7 res = array.isEmpty(); //res:false 8 memset(array.data(), 0, array.size()); 9 res = array.isNull(); //res:false 10 res = array.isEmpty(); //res:false 11 12 QByteArray arrayB(""); 13 //int ab = arrayB.size(); //ab:0 14 res = arrayB.isNull(); //res:false 15 res = arrayB.isEmpty(); //res:true
2.2从16进制字符读入(2个16进制字符表示1个ASCII码)
1 2 QByteArray macAddress = QByteArray::fromHex("123456abcdef"); 3 4 //macSize大小是6,会把两个16进制字符组合成一个ASCII码 5 int macSize = macAddress.size(); 6 macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef" 7 macAddress.toHex(0); // returns "123456abcdef"
2.2内部数据转16进制字符
功能:会把QByteArray存储的原始数据每个字节转成2个16进制字符,不足2个字符会自动补0。
可以设置每个字符之间的连接符(两个16进制字符)
1 QByteArray macAddress = QByteArray::fromHex("123456abcdef"); 2 3 //macSize大小是6,会把两个16进制字符组合成一个ASCII码 4 int macSize = macAddress.size(); 5 //用冒号链接 6 QByteArray mac = macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef" 7 //用-字符链接 8 mac = macAddress.toHex(':'); // returns "12-34-56-ab-cd-ef" 9 mac = macAddress.toHex(0); // returns "123456abcdef"
2.3内部数据转其他进制数字
从数字转为字符
1 int n = 63; 2 //numbArray:会把整数的每个数字转为一个字符 3 QByteArray numbArray = QByteArray::number(n); // returns "63",6和3两个字符 4 QByteArray numbArrayHex = QByteArray::number(n, 16); // returns "3f" 5 QByteArray numbArrayHexUpper = QByteArray::number(n, 16).toUpper(); // returns "3F" 6 char cda = *numbArray.data(); //cda:字符6
浮点数指定经度保存
1 QByteArray ba1 = QByteArray::number(12.3456, 'E', 3); 2 QByteArray ba2 = QByteArray::number(12.3456, 'f', 3); 3 qDebug()<<ba1; // returns "1.235E+01" 4 qDebug()<<ba2; // returns "12.346"
内部数字字符串转数字
1 QByteArray strInt("1234"); 2 bool ok0; 3 qDebug() << strInt.toInt(); // return 1234 4 qDebug() << strInt.toInt(&ok0, 16); // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660 5 6 QByteArray string("1234.56"); 7 bool ok1; 8 int mInt = string.toInt(); // return 0, 小数均视为0 9 mInt = string.toInt(&ok1, 16); // return 0, 小数均视为0 10 float mf = string.toFloat(); // return 1234.56 11 mf = string.toDouble(); // return 1234.56 12 13 QByteArray str("FF"); 14 bool ok2; 15 mInt = str.toInt(&ok2, 16); // return 255, ok2 == true 16 mInt = str.toInt(&ok2, 10); // return 0, ok == false, 转为十进制失败
2.4QByteArray数据访问
mid访问指定范围的数据。
1 char cdata[] = { 1,2,3,4,5 }; 2 QByteArray myTmp; 3 int s = sizeof(cdata) + 1; 4 myTmp.resize(sizeof(cdata)+1); 5 6 //cdata数据拷贝到myTmp数据空间 7 memcpy(myTmp.data(),cdata,sizeof(cdata)); 8 //此时part内容:3,4,5 9 QByteArray part = myTmp.mid(2, 3);
left取前n字节
1 QByteArray x("Pineapple"); 2 3 //取从开始位置4个字符 4 QByteArray y = x.left(4); 5 // y == "Pine"
right取后n字节
1 QByteArray x("Pineapple"); 2 //右5个字符(不计算\0结尾) 3 QByteArray y = x.right(5); 4 // y == "apple"
2.5QByteArray数据空间填充
fill用指定字符填充指定大小内存空间
修改的是原始数据
1 QByteArray ba("Istambul"); 2 ba.fill('o'); 3 // ba == "oooooooo" 4 5 ba.fill('X', 2); 6 // ba == "XX"
三、相关参考
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。