StupidBeauty
Read times:814Posted at:Fri Sep 21 19:07:20 2012
- no title specified

Qt4.8文檔翻譯:QByteArray類參考,QByteArray Class Reference

詳細描述

QByteArray類表示的是字節數組。

QByteArray可用來儲存原始字節數組(其中可以包含'\0')和傳統的8位的以'\0'結尾的字符串。QByteArray 用起來比 const char * 方便多了。在幕後,它永遠保証數據的末尾有一個'\0'結尾,而且它使用了 隱式共享 (寫時復制)以便減少內存占用,并且避免在不必要的時候復制數據。

除了QByteArray 之外,Qt還提供了 QString 類用來儲存字符串。大部分情況下,妳直接使用 QString 就行了。它儲存的是16位的統一碼字符,這樣就可以輕易地在程序裏儲存非ASCII/非Latin-1 的字符了。而且, QString 在 Qt 編程接口裏面用得很普遍的。只有兩種情況下使用QByteArray 是更合適的:妳需要儲存原始的二進制數據;或者需要嚴格控制內存占用(例如,在Qt的嵌入式Linux版中使用)。

簡單地將一個 const char * 傳遞到QByteArray 的構造函數中就可以初始化一個QByteArray。例如,下面的代碼會創建一個長度為5的字節數組,其中的數據是"Hello":

QByteArray ba("Hello");

盡管它的尺寸( size ())是5,這個字節數組還是會在末尾維護一個額外的'\0'字符。這樣的話,當妳使用的某個函數要求使用底層的數據的指針的時候(例如調用 data ()),該指針所指向的數據也能保証其末尾是'\0'。

QByteArray會將這個 const char * 數據進行深層復制,所以妳可以盡管修改它,不會有負作用。(如果妳出于性能方面的考慮而不想要進行深層復制的話,那就使用 QByteArray::fromRawData ()吧。)

另一種初始化手段就是先用 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 ()可能會比快一些,因為它不會引起 深層復制

要想一次性提取多個字節的話,就使用 left ()、 right ()或 mid ()。

QByteArray中可以嵌入值為'\0'的字節。 size ()函數永遠會返回整個數組的尺寸,包括其中的'\0'字節。如果妳想知道那些位于第一個'\0'字符之前的數據的長度,就使用 qstrlen ()。

調用了 resize ()之後,新分配的字節的值是未定義的。要想將所有字節設置成某個特定值,就調用 fill ()。

要想獲取指向實際數據的指針,就調用 data ()或 constData ()。這兩個函數都返回一個指向數據的開頭的指針。直到妳對該QByteArray 調用一個非常量函數之前,這個指針都會確保是有效的。另外還會確保數據是以'\0'結尾的,除非該QByteArray 是從 原始數據 創建的。這個'\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 ()函數的前兩個參數的意思是:從哪個位置開始刪除,以及要刪除的字節個數。

當妳向一個非空的數組中附加( append ())數據的時候,數組會重新分配空間,再將新數據復制進去。妳可以調用 reserve ()來避免這種行為,它會預先分配一定量的內存。妳可以調用 capacity ()來得知QByteArray 實際上使用了多少內存。附加到一個空數組中的數據不會被復制。

一個常見的需求就是從一個字節數組中刪除空白字符('\n'、'\t'、' ',等等)。如果妳想從一個QByteArray 的兩頭刪除空白字符的話,就使用 trimmed ()。如果妳想在兩頭刪除空白字符,并且還想要將字節數組中的連續的空白字符替換成單個的空格字符的話,就使用 simplified ()。

如果妳想在QByteArray 中找到某個特定字符或者子字符串出現的所有位置,那麽就使用 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 ()重載函數。

QByteArrays可使用重載的操作符來比較,例如operator<()、operator<=()、operator==()、operator>=(),等等。 這個比較過程是完全基于字符的數字值的,所以非常快,不過可能并非是普通人預期的結果。如果妳想要對用戶界面中的字符串排序,那麽 QString::localeAwareCompare ()是更好的選擇。

由于歷史原因,對于QByteArray 來說,一個無效的(null)字節數組與一個空的(empty)字節數組是有區別的。無效的(null)字節數組指的是使用QByteArray 的默認構造函數初始化的字節數組,或者直接將(const char *)0傳遞給構造函數產生的字節數組。空的(empty)字節數組指的是尺寸為0的字節數組。一個無效的字節數組永遠是空的,但一個空的字節數組不一定是無效的:

QByteArray ().isNull(); //返回真

QByteArray ().isEmpty(); //返回真

QByteArray ("").isNull(); //返回假

QByteArray ("").isEmpty(); //返回真

QByteArray ("abc").isNull(); //返回假

QByteArray ("abc").isEmpty(); //返回假

除了 isNull ()函數之外,其它函數都會把無效字節數組與空的字節數組等同對待。例如,對于無效的字節數組, data ()會返回一個指向單個'\0'字符的指針( 不是 一個無效指針),而且 QByteArray ()與QByteArray("")在比較時是相等的。我們建議妳一直使用 isEmpty (),避免使用 isNull ()。

關于區域語言的注意事項

數字與字符串的轉換

那些進行數字與字符串轉換的函數都是根據C的區域語言選項來工作的,不理會用戶當前的區域語言設置。使用 QString 來進行與當前區域語言相關的數字與字符串轉換。

8位的字符比較

在QByteArray中,大小寫、哪個字符比另一個字符大,這些都與區域語言選項無關。這一點會影響到以下函數:支持大小寫敏感選項的函數、將它們的參數進行比較的函數、切換它們的參數的大小寫的函數。如果兩個字符串都只包含ASCII 字符的話,大小寫無關的操作和比較就是准確的。(如果設置了 $LC_CTYPE 的話,大部分Unix 系統都會“正確工作”的。)具體來說,會被這一點影響的函數有: contains ()、 indexOf ()、 lastIndexOf ()、operator<()、operator<=()、operator>()、operator>=()、 toLower ()和 toUpper ()。

這一點不會影響到QString,因為它是使用統一碼來表示字符的。

參考 QString QBitArray

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4