0、說明
QByteArray是存儲二進制byte數組。
區別於QString:QByteArray中存儲的全是byte,而QString中存儲的全是16 bit Unicode碼。QString是在Qt API中從頭到尾都用的,而QByteArray則用於以下兩種情況:①存儲原始二進制數據;②內存保護很嚴格的時候(也就是說,不能亂用空間以免冗余)。
構造QByteArray(一)
第一種構造QByteArray的方法是,簡單地把const char *傳入構造函數參數中。例如:
QByteArray ba("Hello");
本例中QByteArray的size()會返回5,不過在該Byte Array末尾還會保留一個額外的'\0'字符。
QByteArray會對const char *數據采取深拷貝的策略,所以處理它時不用考慮邊際效應(即末尾的'\0')。如果不想深拷貝,可以使用QByteArray::fromRawData()。
構造QByteArray(二)
第二種構造方法是,先定義對象,再用resize()設置大小,再為每個byte賦值。
這種情況用得少,這里不再多說,有需要可以去官網查看。
訪問
為了訪問指定位置上的byte,可以用類似array[ i ]的語法形式,用法和char[ ]相同。也可以用at( i )方法,功能與[ ]相同,但是速度上更快,因為at()不會引起深拷貝。
為了一次提取多個bytes,可以用left()、right()、mid()方法。
QByteArray中的'\0'
在QByteArray中可以在中間嵌入'\0'。但是size()方法會統計整個Array的size,包括嵌入的'\0',但是會排除最后的結尾符'\0'。
如果想知道直到第一個'\0'的data長度,可以調用qstrlen()方法。
resize()、fill()
在調用resize()后,多分配的bytes中存放的是一些undefined值。為了給所有bytes填充一個值,可以調用fill()方法。
data()、constData()
為了獲取指向實際數據的指針,可以調用data()與constData()方法。這兩個方法都會返回一個指向數據開頭的指針;並且會確保data以'\0'結尾(除非QByteArray是從raw data提取的),該'\0'是由QByteArray提供的,並且不會被size()計入其中。
數據增刪改
QByteArray提供了以下基本方法用於修改byte data: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"
replace()和remove()方法的前兩個參數指明了修改的起始位置和修改的byte數。
當我們調用append()往非空Array中添加數據時,Array將會重新分配空間並把新的data復制到其中。我們可以通過調用reserve()來避免這種情況,該函數會預分配一定的內存;此外,我們也可以通過調用capacity()來檢查當前的Array實際上分配了多少空間。往空Array中append()數據並不會引起復制。
空白字符消除
一個常用的功能是消除空白字符(如'\n'、'\t'、' '等)。如果我們想刪除QByteArray兩端的空白字符,可以用trimmed()方法。如果我們想移除兩端的空白字符並且把文中的多個連續空白字符替換成單個空白字符,可以用simplified()方法。
空白符: '\t', '\n', '\v', '\f', '\r', ' '
查找字符或子串
如果我們想查找某個字符或子串,可以用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 << Qt::endl; ++j; }
包含特定字符或子串
如果我們想簡單地查看是否包含特定字符或子串,可以用contains()方法。如果我們想看包含特定字符或子串的數量,可以用count()方法。
如果我們想替換特定字符或子串,可以用只有兩個參數的replace()方法。
比較
可以用重載運算符如<、<=、==、>=、>、!=比較兩個QByteArray。比較是基於各個字符的對應的int數值。對於String的比較與排序,則用QString::localAwareCompare()。
空Array與null
由於某些歷史原因,QByteArray對null和空Array分別對待。空Array是大小為0的Array,而null是空指針。通過isNull()、isEmpty()進行檢查。
最大size和溢出
當前版本的QByteArray限制大小為2GB(2^31B bytes)。
1、模塊和加載項
Header: | #include <QByteArray> |
qmake: | QT += core |
2、構造
QByteArray(QByteArray other) | 構造並指向另一個QByteArray的副本 |
QByteArray(int size, char ch) | 構造一個大小為size,每個byte都設置為ch的Array |
QByteArray(const char *data, int size = -1) | 構造一個包含data前size字節的Array |
QByteArray() | 構造一個空Array |
3、靜態字段
class | FromBase64Result | Base64解碼 |
enum | Base64Option | Base64編碼解碼 |
flags | Base64Options | |
typedef | const_iterator | 在QByteArray上的STL樣式的const迭代器 |
typedef | const_reverse_iterator | 在QByteArray上的STL樣式的const逆向迭代器 |
typedef | iterator | 在QByteArray上的STL樣式的非const迭代器 |
typedef | reverse_iterator | 在QByteArray上的STL樣式的非const逆向迭代器 |
3、靜態方法
返回值類型 |
方法 |
說明 |
QByteArray | fromBase64(QByteArray base64, QByteArray::Base64Options options) fromBase64(QByteArray base64) |
Base64 Array的解碼 |
QByteArray::FromBase64Result | fromBase64Encoding(QByteArray base64, QByteArray::Base64Options options = Base64Encoding) |
|
QByteArray | fromCFData(CFDataRef data) | 從CFData構造Array |
fromHex(const QByteArray &hexEncoded) | 將16進制QByteArray進行解碼 | |
fromNSData(const NSData *data) | 從NSData構造Array | |
fromPercentEncoding(const QByteArray &input, char percent = '%') | 從URI/URL樣式的百分制編碼構造Array | |
fromRawCFData(CFDataRef data) | ||
fromRawData(const char *data, int size) | 將一個const char [ ]構造為QByteArray | |
fromRawNSData(const NSData *data) | ||
fromStdString(std::string str) | 從STL樣式的string構造QByteArray | |
number(int n, int base = 10) number(qlonglong n, int base = 10) number(double n, char f = 'g', int prec = 6) |
返回一個QByteArray,其中包含數字對應的進制轉換后的string |
4、成員方法
返回值類型 |
方法 |
說明 |
QByteArray & QByteArray & const char * bool QByteArray & QByteArray & QByteArray & bool bool bool bool bool char、QByteRef |
operator=(QByteArray other) operator=(const char *str) operator!=(QString str) operator+=(QByteArray ba) operator+=(char ch) operator+=(const char *str) operator<(QString str) operator<=(QString str) operator==(QString str) operator>(QString str) operator>=(QString str) operator[](int i) |
|
QByteArray & | append(QByteArray ba) append(char ch) append(int count, char ch) append(const char *str) append(const char *str, int len) |
在末尾插入 |
char | at(int i) | 提取索引為i的字符 |
char | back() | 返回最后一個字符 |
QByteArray::iterator | begin() | 迭代器,指向首個字符 |
int | capacity() | 該Array能存儲的最大bytes |
void | chop(int n) | 移除后n個元素 |
QByteArray | chopped(int len) | 移除后len個元素,並返回移除后的Array |
void | clear() | 清空Array並將它設為null |
int | compare(const char *c, Qt::CaseSensitivity cs = Qt::CaseSensitive) compare(QByteArray a, Qt::CaseSensitivity cs = Qt::CaseSensitive) |
比較兩個Array的大小 |
const char * | constData() | 返回該Array對應的const char * |
bool | contains(QByteArray ba) contains(char ch) contains(const char *str) |
是否包含某個字符、子串 |
int | count(QByteArray ba) count(char ch) count(const char *str) count() |
某個字符、子串的個數 |
char * | data() | 返回該Array對應的char * |
QByteArray::iterator | end() | 迭代器,指向末尾元素后的邏輯元素(實際不存在) |
bool | endsWith(QByteArray ba) endsWith(char ch) endsWith(const char *str) |
是否以指定字符、子串結尾 |
QByteArray & | fill(char ch, int size = -1) | 把Array中的每個byte都設置為char,參數size指明修改后的Array大小 |
char | front() | 返回第一個字符,等同於at(0) |
int | indexOf(QByteArray ba, int from = 0) indexOf(char ch, int from = 0) indexOf(const char *str, int from = 0) |
某個子串、字符首次出現的索引下標 |
QByteArray & | insert(int i, QByteArray ba) insert(int i, char ch) insert(int i, int count, char ch) insert(int i, const char *str) insert(int i, const char *str, int len) |
在指定位置插入 |
bool | isEmpty() | 是否為空 |
bool | isLower() | 是否都是小寫 |
bool | isNull() | 是否為null |
bool | isUpper() | 是否都是大寫 |
bool | lastIndexOf(QByteArray &ba, int from = -1) lastIndexOf(char ch, int from = -1) lastIndexOf(const char *str, int from = -1) |
從最后開始,第一個字符、子串的索引下標 |
QByteArray | left(int len) | 返回Array左邊len bytes的子串構成的Array,超過大小時返回原Array的副本。 |
QByteArray | leftJustified(int width, char fill = ' ', bool truncate = false) | 返回Array左邊len bytes的子串構成的Array,如果超過大小則填充指定值,新Array的大小一定是len bytes。 |
int | length() | 等同於size() |
QByteArray | mid(int pos, int len = -1) | 從索引pos開始,長度為len的子串構成的Array |
QByteArray & | prepend(QByteArray ba) prepend(char ch) prepend(int count, char ch) prepend(const char *str) prepend(const char *str, int len) |
在前邊加字符或子串 |
void | push_back(QByteArray other) push_back(char ch) push_back(const char *str) |
在末尾添加,等同於append。 該方法是為STL兼容性而設計的。 |
void | push_front(QByteArray other) push_front(char ch) push_front(const char *str) |
在前邊添加,等同於prepent。 |
QByteArray & | remove(int pos, int len) | 移除從pos開始,長度為len的子串后的新Array |
QByteArray | repeated(int times) | 返回將該Array重復times次得到的新Array |
QByteArray & | replace(int pos, int len, QByteArray after) replace(int pos, int len, const char *after) replace(int pos, int len, const char *after, int alen) replace(char before, const char *after) replace(char before, QByteArray after) replace(const char *before, const char *after) replace(const char *before, int bsize, const char *after, int asize) replace(QByteArray before, QByteArray after) replace(QByteArray before, const char *after) replace(const char *before, QByteArray after) replace(char before, char after) |
將原Array中從pos開始,長度為len的子串,替換為after后構成的新Array。 |
void | reserve(int size) | 為該Array至少分配size bytes。 該方法和resize()配合將會有更好的表現。 通常情況下我們很少用到該方法。 |
void | resize(int size) | 設置該Array大小為size bytes。 |
QByteArray | right(int len) | 右邊len個字符構成的新Array。 |
QByteArray | rightJustified(int width, char fill = ' ', bool truncate = false) | 右邊width個字符構成的新Array,如果大小超過原Array,則會用指定字符填充左邊多出來的部分。 |
QByteArray & | setNum(int n, int base = 10) setNum(qlonglong n, int base = 10) setNum(double n, char f = 'g', int prec = 6) |
返回一個QByteArray,其中存放數字n進行進制轉換后各個位構成的字符串。 |
QByteArray & | setRawData(const char *data, uint size) | 用data中前size字符構造QByteArray |
void | shrink_to_fit() | 用於STL兼容性。 等同於squeeze()。 |
QByteArray | simplified() | 移除首尾空白符、將文中的連續空白符合並為1個。 |
int | size() | Array中的字符數(不包含末尾的'\0') |
QList<QByteArray> | split(char sep) | 用指定分割符將串分割,得到分割后的子串構成的QList<QByteArray> |
void | squeeze() | 釋放多余的空間 |
bool | startsWith(QByteArray ba) startsWith(char ch) startsWith(const char *str) |
是否以指定字符、子串開頭。 |
void | swap(QByteArray &other) | 互換兩個QByteArray |
QByteArray | toBase64()
|
把串轉換為Base64編碼 |
float | toFloat(bool *ok = nullptr) | 把串轉換為float |
double | toDouble(bool *ok = nullptr) |
把串轉換為double |
QByteArray | toHex() toHex(char separator) |
把串轉換為Hex編碼的QByteArray |
int | toInt(bool *ok = nullptr, int base = 10) | 把串轉化為int |
long | toLong(bool *ok = nullptr, int base = 10) | 把串轉化為long |
qlonglong | toLongLong(bool *ok = nullptr, int base = 10) | 把串轉化為longlong |
QByteArray | toLower() | 所有字母小寫化 |
QByteArray | toUpper() | 所有字母大寫化 |
QByteArray | trimmed() | 移除首尾的空白字符 |
void | truncate(int pos) | 從頭開始截斷到pos處 |