QT之QByteArry
Qt通過QByteArray為我們提供了一個字節數組容器。QByteArray既可以用來存儲原始的字節,包括'\0',也可以用來存儲傳統的8-bit 的以'\0'結尾的字符串。使用QByteArray比使用普通的const char* 更方便。並且,在底層,它可以確保其中存儲的數據以'\0'結尾,並且通過隱式共享(寫時拷貝)策略減少內存的使用和不必要的數據復制。
1、QByteArry的初始化
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
QByteArray strInt("1234");
2、QByteArry的訪問
- 1、訪問方式共有四種:[]、data[]和at()、 constData[];
- 2、[]和data[]為可讀可寫;
- 3、at()和constData[]僅為可讀。如果僅是讀,則通過at()和constData[]訪問速度最快。
QByteArray ba;
ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31; //可讀可寫訪問
//可讀可寫訪問
qDebug()<<"[]"<<ba[2];
qDebug()<<"data()"<<ba.data()[2];
//僅讀訪問
qDebug()<<"at()"<<ba.at(2);
qDebug()<<"constData()"<<ba.constData()[2];
3、QByteArry的字節大小
QByteArray可以嵌入“\0” 字節,size()函數總是返回整個數組的大小,包括嵌入的’\ 0’字節,但不包括QByteArray自動添加的終止’\ 0’.
QByteArray s;
s.resize(5);
s[0] = '1';
s[1] = '2';
s[2] = '3';
s[3] = '\0';
s[4] = 'a';
cout << s.size() << endl; //打印大小5,但實際在內存中存儲的大小為6,因為自動加了/0的特點
cout << s << endl; //屏幕打印的是:“123 a”
//s.size()為5,但是字節數組在最后還會保留一個額外的’\ 0’字符, 以便如果使用一個函數來請求指向底層數據的指針(例如調用data()),那么指出的數據保證被’\ 0’終止。
4、QByteArry的相互轉換
5.1 Hex轉換(1個hex編碼由兩個字符構成)
//把Hex編碼轉換為char存儲到QByteArray:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // returns "Qt is great!"
//"517420697320677265617421" 每兩個字符表示一個16進制編碼,如51表示"Q"
//把QByteArray轉為Hex編碼:
QByteArray ba;
ba.resize(3);
ba[0] = 0x1;
ba[1] = 0x2;
ba[2] = 0x3;
qDebug() << ba.toHex(); //return "010203"
5.2 數值轉換與輸出
//盡管QByteArray是一個集合,但也可以作為一個特殊形式的數值用,其靈活的轉換格式,可大大方便各種格式數據轉換與顯示的需求。如顯示二進制和十六進制、顯示科學計數和指定小數位的數值。
int n = 63;
qDebug()<<QByteArray::number(n); // returns "63"
qDebug()<<QByteArray::number(n, 16); // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F"
qDebug()<<QByteArray::number(n, 2); // returns "111111"
qDebug()<<QByteArray::number(n, 8); // returns "77"
//按照指定進制格式直接賦值,其中n可以是各類常見數值類型:
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
//把數值按指定格式和小數位轉換輸出,小數位四舍五入:
QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
qDebug()<<ba1; // returns "1.235E+01"
qDebug()<<ba2; // returns "12.346"
5.3 QByteArray字符串數值轉為各類數值
QByteArray若為數值,可通過to**方法轉為各種類型數據,示例如下:
QByteArray strInt("1234");
bool ok0;
qDebug() << strInt.toInt(); // return 1234
qDebug() << strInt.toInt(&ok0,16); // return 4660, 默認把1234作為0x1234,對應十進制數值為4660
QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt(); // return 0, 小數均視為0
qDebug() << string.toInt(&ok1,16); // return 0, 小數均視為0
qDebug() << string.toFloat(); // return 1234.56
qDebug() << string.toDouble(); // return 1234.56
QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16); // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10); // return 0, ok == false, 轉為十進制失敗
5.4 大小寫轉換
QByteArray若為帶大小寫的字符串,可通過toUpper()和toLower()方法實現大小寫轉換:
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
3、QByteArry的接口函數
(1). char *QByteArray::data()
//返回指向字節數組中存儲的數據的指針。該指針可用於訪問和修改組成數組的字節。具體訪問字節數組中的某一個,采用ba.data()[0]–>訪問第0個
QByteArray ba("Hello world");
char *data = ba.data();//返回一個指向字節數組ba的數據指針,指向第一個字符
qDebug() << ba.data();//打印整個字符
while (*data)
{
cout << "[" << *data << "]" << endl;
++data;
}
//得到結果 [ H ] ,[ e ] ,[ l ] ,[ l ] ,[ o ], [ ], [ w ] ,[ r ] ,[ l ] ,[ d ].
(2). QByteArray &QByteArray::fill(char ch, int size = -1)
//將字節數組中的每個字節設置為字符ch。如果size與-1(默認值)不同,則字節數組將預先調整為大小。
QByteArray ba("Istambul");
ba.fill('o');
// ba == "oooooooo"
ba.fill('X', 2);
// ba == "XX"
(3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const
//返回該字節數組中第一次出現字節數組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
(4). bool QByteArray::isEmpty() const
如果字節數組的大小為0,返回true; 否則返回false。
(5). QByteArray QByteArray::left(int len) const
//返回一個包含該字節數組最左側len個字節的字節數組,如果len大於size(),則返回整個字節數組.
QByteArray x("Pineapple");
QByteArray y = x.left(4); // y == "Pine"
(6). QByteArray QByteArray::number(int n, int base = 10)
//返回一個字節數組,其中包含等價於數字n到基數的字符串(默認為10)。基數可以是2到36之間的任何值。
int n = 63;
QByteArray::number(n); // returns "63"
QByteArray::number(n, 16); // returns "3f"
QByteArray::number(n, 16).toUpper(); // returns "3F"
//可以理解為 int 類型到QByteArray類型的轉化。
(7). QByteArray &QByteArray::setNum(int n, int base = 10)
//將字節數組設置為基數為n的打印值(默認為10)並返回對字節數組的引用。基數可以是介於2和36之間的任何值。對於非10以外的其他值,n被視為無符號整數。
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
(8). int QByteArray::size() const
//返回此字節數組中的字節數。
QByteArray ba("Hello");
int n = ba.size(); // n == 5
ba.data()[0]; // returns 'H' 操作某一位的方法
ba.data()[4]; // returns 'o'
ba.data()[5]; // returns '\0'
(9)double QByteArray::toDouble(bool *ok = Q_NULLPTR) const
float QByteArray::toFloat(bool *ok = Q_NULLPTR) const
int QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const
//返回轉換為double值的字節數組。
QByteArray string("1234.56");
double a = string.toDouble(); // a == 1234.56
(10). QByteArray QByteArray::toHex() const
返回字節數組的十六進制編碼副本。十六進制編碼使用數字 0 - 9 和字母 a - f。
See also fromHex().
