Qt:QByteArray


0、說明

QByteArray是存儲二進制byte數組。

區別於QString:QByteArray中存儲的全是byte,而QString中存儲的全是16 bit Unicode碼。QString是在Qt API中從頭到尾都用的,而QByteArray則用於以下兩種情況:①存儲原始二進制數據;②內存保護很嚴格的時候(也就是說,不能亂用空間以免冗余)。

構造QByteArray(一)

第一種構造QByteArray的方法是,簡單地把const char *傳入構造函數參數中。例如:

QByteArray ba("Hello");

本例中QByteArraysize()會返回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()方法會統計整個Arraysize,包括嵌入'\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大小為0Array,而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 const char *()

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處


免責聲明!

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



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