一、用途
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"