1)QByteArray類提供了一個[位元組]數組。QByteArray 既可以儲存原始的位元組(包括'\0'),又可以被用來儲存慣例上8位以'\0'結尾的字串。<可以理解為字元數組,charstr[] = {'h','e','l','l','o','\0'} 或者 charstr = "hello">。由於QByteArray封裝的功能很多,使用起來比char*要方便的多,而就其內部實現來講,它會保證所有的資料以'\0'結尾,使用隱式資料共用(copy-on-write)來減少記憶體消耗以及不必要的資料拷貝。
2)除了QByteArray,Qt中還提供了QString類來儲存字串,大部分情況下,我們都是在使用QString。QString儲存了16位unicode碼,很容易用來儲存非ASCII或是非Lantin1的編碼,另外QString在所有的QtAPI中都是通用的。
3)有兩種情況下會比較適合使用QByteArray,第一就是要儲存純位元據(raw binary data)或8-bit編碼文本字串,第二種情況就是在記憶體資源很珍貴的情況下,例如 Qt for Embedded Linux。
----------------------------------------------------------------------
4)一種初始化QByteArray方式是給它的建構函式傳入一個const char* 即可。此時,QByteArray執行了深拷貝(deep copy、如實值型別),如果出於效率考慮不想執行深拷貝,使用QByteArray::fromRawData(const char * data, int siz)/* 返回的 QByteArray 對象將會和資料指標相關聯 */。
QByteArrayarray("Hello");array的size( )是5,但由於其在最後要儲存額外的'\0',其實際佔用空間是6。
=============================常用操作函數==============================
1、int QByteArray::size() const /* sizeof() */
如果QByteArray在從 raw 資料建立時,不包含尾隨的終止符,QByteArray不會自動調用添加,除非通過深拷貝進行建立:
QByteArray ba("Hello");
int n = ba.size(); // n == 5
ba.data()[0]; // returns 'H'
ba.data()[4]; // returns 'o'
ba.data()[5]; // returns '\0'
----------------------------------------------------------------------
2、跟C++的普通數組一樣,也可以使用 [] 來訪問其具體下表對應的位元組,對於非const的 QByteArray,可以直接進行賦值:
1. QByteArray array;
2. array.resize( 5 );
3. array [0] = 0x3c;
4. array [1] = 0xb8;
5. array [2] = 0x64;
6. array [3] = 0x18;
7. array [4] = 0xca;
----------------------------------------------------------------------
3.對於唯讀操作,請使用“at( )“,因為它可以避免深拷貝,比使用“[ ]“要快,效率要高:
1. for ( int i = 0 ; i < array.size( ) ; ++ i ) {
2. if ( array.at(i ) >= 'a' && array.at(i ) <= 'f')
3. cout << "Found character in range [ a – f ] " << endl ;
4. }
----------------------------------------------------------------------
4、使用left( ), right( ), 或者 mid,一次取出多個字元。
1)QByteArray QByteArray ::left(int len) const
The entire byte array is returned if len is greater than size().
Example:
QByteArray x("Pineapple");
QByteArray y = x.left(4);
// y == "Pine"
2)QByteArray QByteArray::right(int len) const
The entire byte array is returned if len is greater than size().
Example:
QByteArray x("Pineapple");
QByteArray y = x.right(5);
// y == "apple"
3)QByteArray QByteArray::mid(int pos, int len = -1) const
以 pos 作為起點,返回指定位元組長度的 array ,如果 len 為-1(預設),或者 pos+len >= size(),將返回從指定為pos開始直到位元組數組尾的所有位元組。
Example:
QByteArray x("Five pineapples");
QByteArray y = x.mid(5, 4); // y == "pine"
QByteArray z = x.mid(5); // z == "pineapples"
----------------------------------------------------------------------
5、char * QByteArray::data()//Returns a pointer to the data stored in the byte array
const char * QByteArray::constData() const//Returns a pointer to the data stored in the byte array
通過data() 或者constData()可以獲得 QByteArray 的真實資料的指標,獲得的資料指標在調用QByteArray的non-const函數之前都是有效。
6、uint qstrlen(const char * str) /* 如C++中的strlen() */
Returns the number of characters that precede(先於) the terminating '\0', or 0 if str is 0.
>>>size()和qtrlen()的傳回值:
QByteArray array = "hello world!";
printf("%d\n", array.size( )-1 );
printf("%c\n", array.data()[array.size()]);
printf("%d\n", qstrlen( ( const char* ) array.data( ) ) );
7、QByteArray 提供了很多修改位元組的方法: append(), prepend(), insert(), replace() and remove()。
如下所示:
QByteArray x("and");
x.prepend("rock "); // x == "rock and"
x.append(" roll"); // x == "rock and roll"
x.replace(5, 3, "&"); // x == "rock & roll"
=====================================================================
8、QBuffer 類是一個操作QByteArray 的輸入/輸出裝置的介面。// TheQBuffer class provides aQIODeviceinterface for a QByteArray .
建構函式:QBuffer(QByteArray * byteArray, QObject * parent = 0)
----------------------------------------------------------------------
QBuffer 類用來讀寫記憶體緩衝。在使用之前使用 open() 來開啟緩衝並且設定模式(唯讀、唯寫等等)。
QDataStream 和 QTextStream 也可以使用一個 QByteArray 參數來構造,這些建構函式建立並且開啟一個內部的QBuffer。
QDataStream::QDataStream(QByteArray * a, QIODevice::OpenMode mode)
/*The QDataStream class provides serialization of binary data to a QIODevice*/
----------------------------------------------------------------------
QTextStream(QByteArray * array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
----------------------------------------------------------------------
const QByteArray & QBuffer::data() const //Returns the data contained in the buffer.