QT之QByteArry


QT之QByteArry

Qt通過QByteArray為我們提供了一個字節數組容器。QByteArray既可以用來存儲原始的字節,包括'\0',也可以用來存儲傳統的8-bit 的以'\0'結尾的字符串。使用QByteArray比使用普通的const char* 更方便。並且,在底層,它可以確保其中存儲的數據以'\0'結尾,並且通過隱式共享(寫時拷貝)策略減少內存的使用和不必要的數據復制。

1、QByteArry的初始化

QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
QByteArray strInt("1234");

2、QByteArry的訪問

  • 1、訪問方式共有四種:[]、data[]和at()、 constData[];
  • 2、[]和data[]為可讀可寫;
  • 3、at()和constData[]僅為可讀。如果僅是讀,則通過at()和constData[]訪問速度最快。
QByteArray ba;

ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31; //可讀可寫訪問

//可讀可寫訪問
qDebug()<<"[]"<<ba[2]; 
qDebug()<<"data()"<<ba.data()[2];

//僅讀訪問
qDebug()<<"at()"<<ba.at(2); 
qDebug()<<"constData()"<<ba.constData()[2]; 

3、QByteArry的字節大小

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

QByteArray s;
s.resize(5);
s[0] = '1';
s[1] = '2';
s[2] = '3';
s[3] = '\0';
s[4] = 'a';
cout << s.size() << endl;  //打印大小5,但實際在內存中存儲的大小為6,因為自動加了/0的特點
cout << s << endl; //屏幕打印的是:“123 a”

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

4、QByteArry的相互轉換

5.1 Hex轉換(1個hex編碼由兩個字符構成)

//把Hex編碼轉換為char存儲到QByteArray:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"
//"517420697320677265617421" 每兩個字符表示一個16進制編碼,如51表示"Q"

//把QByteArray轉為Hex編碼:
QByteArray ba;
ba.resize(3);
ba[0] = 0x1;
ba[1] = 0x2;
ba[2] = 0x3;
qDebug() << ba.toHex(); //return "010203"

5.2 數值轉換與輸出

//盡管QByteArray是一個集合,但也可以作為一個特殊形式的數值用,其靈活的轉換格式,可大大方便各種格式數據轉換與顯示的需求。如顯示二進制和十六進制、顯示科學計數和指定小數位的數值。

int n = 63;

qDebug()<<QByteArray::number(n);              // returns "63"

qDebug()<<QByteArray::number(n, 16);          // returns "3f"

qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"

qDebug()<<QByteArray::number(n, 2);          // returns "111111"

qDebug()<<QByteArray::number(n, 8);          // returns "77"

//按照指定進制格式直接賦值,其中n可以是各類常見數值類型:

QByteArray ba;

int n = 63;

ba.setNum(n);           // ba == "63"

ba.setNum(n, 16);       // ba == "3f"
//把數值按指定格式和小數位轉換輸出,小數位四舍五入:

QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);

QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);

qDebug()<<ba1;  // returns "1.235E+01"

qDebug()<<ba2;  // returns "12.346"

5.3 QByteArray字符串數值轉為各類數值

QByteArray若為數值,可通過to**方法轉為各種類型數據,示例如下:

QByteArray strInt("1234");

bool ok0;

qDebug() << strInt.toInt();   // return 1234

qDebug() << strInt.toInt(&ok0,16);   // return 4660, 默認把1234作為0x1234,對應十進制數值為4660

 

QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt();   // return 0, 小數均視為0
qDebug() << string.toInt(&ok1,16);   // return 0, 小數均視為0
qDebug() << string.toFloat();   // return 1234.56
qDebug() << string.toDouble();   // return 1234.56

 

QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16);     // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10);     // return 0, ok == false, 轉為十進制失敗

5.4 大小寫轉換

QByteArray若為帶大小寫的字符串,可通過toUpper()和toLower()方法實現大小寫轉換:

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();   // y == "qt by the qt company"
QByteArray z = x.toUpper();  // z == "QT BY THE QT COMPANY

3、QByteArry的接口函數

(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;
}

//得到結果 [ 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"

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

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

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

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

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

//返回一個包含該字節數組最左側len個字節的字節數組,如果len大於size(),則返回整個字節數組. 
QByteArray x("Pineapple");
QByteArray y = x.left(4); // y == "Pine"

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

//返回一個字節數組,其中包含等價於數字n到基數的字符串(默認為10)。基數可以是2到36之間的任何值。 
int n = 63;
QByteArray::number(n);              // returns "63"
QByteArray::number(n, 16);          // returns "3f"
QByteArray::number(n, 16).toUpper();  // returns "3F"
//可以理解為 int 類型到QByteArray類型的轉化。

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

//將字節數組設置為基數為n的打印值(默認為10)並返回對字節數組的引用。基數可以是介於2和36之間的任何值。對於非10以外的其他值,n被視為無符號整數。
QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"

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

//返回此字節數組中的字節數。 
     QByteArray ba("Hello");
     int n = ba.size();          // n == 5
     ba.data()[0];               // returns 'H'  操作某一位的方法
     ba.data()[4];               // returns 'o'
     ba.data()[5];               // returns '\0'

(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值的字節數組。 
QByteArray string("1234.56");
double a = string.toDouble();   // a == 1234.56

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM