欢迎访问mehome的博客

Tomorrow is another day.
Fork me on GitHub

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. 方法1:直接append方法追加数据,然后调用resize方法设置QByteArray数据大小;
    2. 方法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"


三、相关参考

posted @ 2022-03-06 14:49  mehome  阅读(2349)  评论(0编辑  收藏  举报