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"


三、相關參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM