Qt之QVariant和QByteArray詳解(三)

來源:互聯網
上載者:User

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類來儲存字串,大部分情況下,我們都是在使用QStringQString儲存了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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.