QByteArray類

QByteArray類

提供一個字節數組,QByteArray可用於存儲原始字節(包括“\ 0” )和傳統的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char *更方便.

除了QByteArray之外,Qt還提供了QString類來存儲字符串數據。對於大多數用途,QString是您要使用的類。它存儲16位Unicode字符,使您可以輕鬆地在應用程序中存儲非ASCII /非拉丁字符。此外,QSt API在Qt API中始終使用。 
QByteArray適合的兩個主要情況是當您需要存儲原始二進制數據,並且當內存保護至關重要時(例如,使用嵌入式Linux的Qt)

初始化QByteArray的一種方法是const char *將其傳遞給其構造函數。例如,以下代碼創建一個大小爲5的字節數組, 
其中包含數據“Hello”:

            QByteArray ba("Hello");
  • 1

雖然size()爲5,但是字節數組在最後還會保留一個額外的’\ 0’字符, 
以便如果使用一個函數來請求指向底層數據的指針(例如調用data()),那麼指出的數據保證被’\ 0’終止。

另一種方法是使用resize()設置數組的大小,並初始化每個字節的數據字節.

QByteArray使用基於0的索引,就像C ++數組一樣。 
要訪問特定索引位置的字節,可以使用operator[] ()在非 常量字節數組上,operator 返回一個可以在賦值左側使用的字節的引用。例如:

            QByteArray ba;
              ba.resize(5);
              ba[0] = 0x3c;
              ba[1] = 0xb8;
              ba[2] = 0x64;
              ba[3] = 0x18;
              ba[4] = 0xca;
            //對於只讀訪問,替代語法是使用at():
             for (int i = 0; i < ba.size(); ++i) 
             {
                if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
                    cout << "Found character in range [a-f]" << endl;
             }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

at()可以比operator []()更快,因爲它不會導致深層拷貝發生。

要一次提取多個字節,請使用 left(),right() 或mid()。

QByteArray可以嵌入“\0” 字節,size()函數總是返回整個數組的大小,包括嵌入的’\ 0’字節,但不包括QByteArray添加的終止’\ 0’.

調用resize()後,新分配的字節具有未定義的值。 要將所有字節設置爲特定值,請調用fill()。

要獲取指向實際字符數據的指針,請調用data()或constData()。這些函數返回一個指向數據開頭的指針。 
指針保持有效,直到在QByteArray上調用了非const函數。除了從原始數據創建QByteArray之外,還保證數據以”\ 0”字節結尾。這個’\ 0’字節由QByteArray自動提供,並不會在size()中計算。

QByteArray類提供以下用於修改字節數據的基本功能:append(),prepend() ,insert(),replace()和remove()。

QByteArray x("and");
x.prepend("rock ");         // x == "rock and"  前置
x.append(" roll");          // x == "rock and roll" 附加
x.replace(5, 3, "&");       // x == "rock & roll" 替代
  • 1
  • 2
  • 3
  • 4

這個 replace() 和remove()函數,前兩個參數是從其開始擦除的位置和應該被擦除的字節數。

一個常見的要求是從字節數組(’\ n’,’\ t’,’等)中刪除空白字符,如果要從QByteArray兩端刪除空格,請使用trimmed()。 
如果要從兩端移除空格並用字符數組中的單個空格替換多個連續的空格,請使用simplified()。

如果要查找QByteArray中特定字符或子字符串的所有出現,請使用indexOf()或lastIndexOf()。 
indexOf()從給定的索引位置開始搜索,lastIndexOf()向後搜索。兩者返回字符或子字符串的索引位置, 
如果它們找到它; 否則返回-1 。例如,這是一個典型的循環,它查找特定子字符串的所有出現:

QByteArray ba("We must be <b>bold</b>, very <b>bold</b>");
int j = 0;
while ((j = ba.indexOf("<b>", j)) != -1) 
{
    cout << "Found <b> tag at index position " << j << endl;
    ++j;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果您只想檢查QByteArray是否包含特定字符或子字符串,請使用contains()。 
如果要查找字節數組中特定字符或子字符串的次數,請使用count()。 
如果要將特定值的所有出現替換爲另一個,請使用兩個參數replace()重載之一。

可以使用運算符<(),運算符<=(),運算符==(),運算符>=()等重載運算符來比較QByteArray。比較完全基於字符的數值,非常快,但不是我們期望的。QString :: localeAwareCompare()是排序用戶界面字符串的更好選擇。

由於歷史原因,QByteArray區分了一個Null byte 和 empty byte. 我們建議您始終使用isEmpty().

成員函數:

(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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

得到結果 [ 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"
  • 1
  • 2
  • 3
  • 4
  • 5

(3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const

返回該字節數組中第一次出現字節數組ba的索引位置,從索引位置向前搜索。如果找不到ba,則返回-1 。

eg:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(4). bool QByteArray::isEmpty() const

如果字節數組的大小爲0,返回true; 否則返回false。

(5). QByteArray QByteArray::left(int len) const

返回一個包含該字節數組最左側len個字節的字節數組,如果len大於size(),則返回整個字節數組. 
eg:

QByteArray x("Pineapple");
 QByteArray y = x.left(4); // y == "Pine"
  • 1
  • 2

(6). QByteArray QByteArray::number(int n, int base = 10)

返回一個字節數組,其中包含等價於數字n到基數的字符串(默認爲10)。基數可以是2到36之間的任何值。 
eg:

int n = 63;
 QByteArray::number(n);              // returns "63"
QByteArray::number(n, 16);          // returns "3f"
QByteArray::number(n, 16).toUpper();  // returns "3F"
  • 1
  • 2
  • 3
  • 4

可以理解爲 int 類型到QByteArray類型的轉化。

(7). QByteArray &QByteArray::setNum(int n, int base = 10)

將字節數組設置爲基數爲n的打印值(默認爲10)並返回對字節數組的引用。基數可以是介於2和36之間的任何值。對於非10以外的其他值,n被視爲無符號整數。

eg:

QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"
  • 1
  • 2
  • 3
  • 4
  • 5

(8). int QByteArray::size() const

返回此字節數組中的字節數。 
eg:

    QByteArray ba("Hello");
     int n = ba.size();          // n == 5
     ba.data()[0];               // returns 'H'  操作某一位的方法
  ba.data()[4];               // returns 'o'
    ba.data()[5];               // returns '\0'
  • 1
  • 2
  • 3
  • 4
  • 5

(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值的字節數組。

eg:

QByteArray string("1234.56");
double a = string.toDouble();   // a == 1234.56
  • 1
  • 2

(10). QByteArray QByteArray::toHex() const

返回字節數組的十六進制編碼副本。十六進制編碼使用數字 0 - 9 和字母 a - f。 
See also fromHex().

(11). std::string QByteArray::toStdString() const

返回std :: string對象,帶有QByteArray中包含的數據的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章