1. 程式人生 > >Qt總結之十五:QByteArray詳解

Qt總結之十五: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");


雖然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;
 }


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" 替代


這個 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;
}


如果您只想檢查QByteArray是否包含特定字元或子字串,請使用contains()。 
如果要查詢位元組陣列中特定字元或子字串的次數,請使用count()。 
如果要將特定值的所有出現替換為另一個,請使用兩個引數replace()過載之一。

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

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

二、成員函式


函式一: 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 ].

函式二: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"


函式三: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


函式四:bool QByteArray::isEmpty() const
如果位元組陣列的大小為0,返回true; 否則返回false。

函式五:QByteArray QByteArray::left(int len) const
返回一個包含該位元組陣列最左側len個位元組的位元組陣列,如果len大於size(),則返回整個位元組陣列. 
eg:

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


函式六: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"


可以理解為 int 型別到QByteArray型別的轉化。

函式七: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"


函式八: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'



函式九:

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


函式十:QByteArray QByteArray::toHex() const
返回位元組陣列的十六進位制編碼副本。十六進位制編碼使用數字 0 - 9 和字母 a - f。 
See also fromHex().

函式十一:std::string QByteArray::toStdString() const
返回std :: string物件,帶有QByteArray中包含的資料的.