怎樣做網(wǎng)站二維碼windows優(yōu)化大師怎么下載
QByteArray字節(jié)數(shù)組
文章目錄
- QByteArray字節(jié)數(shù)組
- 1.1 QByteArray類基本使用說明
- 1.2 設(shè)置數(shù)組字節(jié)大小
- 1.3 返回?cái)?shù)組大小
- 1.4 將數(shù)據(jù)轉(zhuǎn)為其他類型
- 1.5 將數(shù)據(jù)轉(zhuǎn)為C語言的字符指針返回
- 1.6 數(shù)組數(shù)據(jù)追加
- 1.7 清除數(shù)組數(shù)據(jù)為指定值
- 1.8 數(shù)組數(shù)據(jù)插入
- 1.9 刪除指定位置指定長度的數(shù)據(jù)
- 1.10 替換指定位置的數(shù)據(jù)
- 1.11 數(shù)組數(shù)據(jù)查找
- 1.12 去除空白字符
- 1.13 QBuffer類介紹
- 1.13.1QBuffer基本使用介紹
- 1.13.2 數(shù)據(jù)讀寫示例
- 1.13.3 數(shù)據(jù)處理一行的數(shù)據(jù)
1.1 QByteArray類基本使用說明
QByteArray
類提供了一個(gè)字節(jié)數(shù)組。
QByteArray
可用于存儲(chǔ)原始字節(jié)(包括’\ 0’)和傳統(tǒng)的8位’\ 0’終止字符串。使用QByteArray
比使用const char *方便得多。在幕后,它始終確保數(shù)據(jù)后面跟著’\ 0’終止符,并使用隱式共享(寫時(shí)復(fù)制)來減少內(nèi)存使用并避免不必要的數(shù)據(jù)復(fù)制。
除了QByteArray
之外,Qt還提供了QString
類來存儲(chǔ)字符串?dāng)?shù)據(jù)。對(duì)于大多數(shù)目的而言,QString
是常用的類。它存儲(chǔ)16位Unicode字符,使你可以輕松地在應(yīng)用程序中存儲(chǔ)非ASCII /非拉丁字母字符。此外,QString
在整個(gè)Qt API中都有使用。QByteArray適用的兩種主要情況是何時(shí)需要存儲(chǔ)原始二進(jìn)制數(shù)據(jù),何時(shí)需要對(duì)內(nèi)存進(jìn)行保存(例如,使用Qt for Embedded Linux
)。
初始化QByteArray
的一種方法就是將const char *
傳遞給它的構(gòu)造函數(shù)。例如,下面的代碼創(chuàng)建一個(gè)包含數(shù)據(jù)“Hello”的大小為5的字節(jié)數(shù)組:
QByteArray ba("Hello");
盡管size()是5,但字節(jié)數(shù)組在末尾還保留了一個(gè)額外的’\ 0’字符,因此如果使用了一個(gè)函數(shù)來請(qǐng)求指向底層數(shù)據(jù)的指針(例如調(diào)用data()),則指向的數(shù)據(jù)保證以’\ 0’結(jié)尾。
另一種方法是使用resize()設(shè)置數(shù)組的大小并初始化每個(gè)字節(jié)的數(shù)據(jù)字節(jié)。 QByteArray使用基于0的索引,就像C ++數(shù)組一樣。要訪問特定索引位置的字節(jié),可以使用operator 。 在非常量字節(jié)數(shù)組上,operator 返回可以在賦值左側(cè)使用的字節(jié)的引用。 例如:
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
對(duì)于只讀訪問,另一種語法是使用at():
for (int i = 0; i < ba.size(); ++i)
{if (ba.at(i) >= 'a' && ba.at(i) <= 'f')cout << "Found character in range [a-f]" << endl;
}
at()比operator 更快,因?yàn)樗肋h(yuǎn)不會(huì)導(dǎo)致發(fā)生深層復(fù)制。
要一次提取多個(gè)字節(jié),請(qǐng)使用left(),right()或mid()。
QByteArray可以嵌入’\ 0’字節(jié)。Size()函數(shù)總是返回整個(gè)數(shù)組的大小,包括嵌入的’\ 0’字節(jié),但不包括由QByteArray添加的終止’\ 0’。例如:
QByteArray ba1("ca\0r\0t");
ba1.size(); // Returns 2.
ba1.constData(); // Returns "ca" with terminating \0.QByteArray ba2("ca\0r\0t", 3);
ba2.size(); // Returns 3.
ba2.constData(); // Returns "ca\0" with terminating \0.QByteArray ba3("ca\0r\0t", 4);
ba3.size(); // Returns 4.
ba3.constData(); // Returns "ca\0r" with terminating \0.const char cart[] = {'c', 'a', '\0', 'r', '\0', 't'};
QByteArray ba4(QByteArray::fromRawData(cart, 6));
ba4.size(); // Returns 6.
ba4.constData(); // Returns "ca\0r\0t" without terminating \0.
如果想要獲取數(shù)據(jù)的長度并排除第一個(gè)’\ 0’字符,請(qǐng)?jiān)谧止?jié)數(shù)組上調(diào)用qstrlen()。
調(diào)用resize()之后,新分配的字節(jié)具有未定義的值。 要將所有字節(jié)設(shè)置為特定值,請(qǐng)調(diào)用fill()。
要獲取指向?qū)嶋H字符數(shù)據(jù)的指針,請(qǐng)調(diào)用data()或constData()。 這些函數(shù)返回一個(gè)指向數(shù)據(jù)開頭的指針。 該指針保證保持有效,直到在QByteArray上調(diào)用非const函數(shù)為止。除非QByteArray是從原始數(shù)據(jù)創(chuàng)建的,否則也保證數(shù)據(jù)以’\ 0’字節(jié)結(jié)尾。這個(gè)’\0’字節(jié)由QByteArray自動(dòng)提供,不計(jì)入size()。
QByteArray提供了修改字節(jié)數(shù)據(jù)的以下基本函數(shù):append(),prepend(),insert(),replace()和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()函數(shù)的前兩個(gè)參數(shù)是要開始擦除的位置和應(yīng)該擦除的字節(jié)數(shù)。
將數(shù)據(jù)附加到非空數(shù)組時(shí),數(shù)組將被重新分配并將新數(shù)據(jù)復(fù)制到它。你可以通過調(diào)用reserve()來預(yù)防分配一定數(shù)量的內(nèi)存,從而避免此行為。你也可以調(diào)用capacity()來找出QByteArray實(shí)際分配了多少內(nèi)存。
通常的要求是從字節(jié)數(shù)組中刪除空格字符(‘\ n’,'\ t’等)。如果你想從QByteArray的兩端刪除空格,使用trimmed()。如果要從兩端刪除空格并用字節(jié)數(shù)組中的單個(gè)空格字符替換多個(gè)連續(xù)的空格,請(qǐng)使用simplified()。
如果要查找QByteArray中特定字符或子字符串的所有匹配項(xiàng),請(qǐng)使用indexOf()或lastIndexOf()。前者從一個(gè)給定的索引位置開始搜索,后者向后搜索。如果他們找到它們,它們都會(huì)返回字符或子字符串的索引位置;否則,它們返回-1。例如,下面是一個(gè)典型的循環(huán),它查找所有出現(xiàn)的特定子字符串:
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 << endl;++j;
}
如果你只是想檢查QByteArray是否包含特定的字符或子字符串,請(qǐng)使用contains()。如果要查明字節(jié)數(shù)組中出現(xiàn)特定字符或子字符串的次數(shù),請(qǐng)使用count()。如果要將所有特定值替換為另一個(gè)值,請(qǐng)使用兩個(gè)參數(shù)replace()重載之一。
QByteArrays可以使用重載操作符(比如operator <(),operator <=(),operator ==(),operator> =()等進(jìn)行比較。該比較僅基于字符的數(shù)字值。 QString :: localeAwareCompare()是排序用戶界面字符串的更好選擇。
由于歷史原因,QByteArray區(qū)分了空字節(jié)數(shù)組和空字節(jié)數(shù)組。空字節(jié)數(shù)組是一個(gè)字節(jié)數(shù)組,它使用QByteArray的默認(rèn)構(gòu)造函數(shù)或通過將(const char *)0傳遞給構(gòu)造函數(shù)來初始化??兆止?jié)數(shù)組是大小為0的任何字節(jié)數(shù)組??兆止?jié)數(shù)組始終為空,但空字節(jié)數(shù)組不一定為空:
QByteArray().isNull(); // returns true
QByteArray().isEmpty(); // returns trueQByteArray("").isNull(); // returns false
QByteArray("").isEmpty(); // returns trueQByteArray("abc").isNull(); // returns false
QByteArray("abc").isEmpty(); // returns false
除了isNull()以外,所有函數(shù)都將空字節(jié)數(shù)組視為空字節(jié)數(shù)組。例如,data()返回一個(gè)指向空字節(jié)數(shù)組(不是空指針)的’\ 0’字符的指針,并且QByteArray()將等于QByteArray(“”)。建議始終使用isEmpty()并避免使用isNull()。
有關(guān)語言環(huán)境的注釋
數(shù)字字符串轉(zhuǎn)換
執(zhí)行數(shù)字?jǐn)?shù)據(jù)類型和字符串之間的轉(zhuǎn)換的函數(shù)在C語言環(huán)境中執(zhí)行,與用戶的區(qū)域設(shè)置無關(guān)。使用QString在數(shù)字和字符串之間執(zhí)行區(qū)域識(shí)別轉(zhuǎn)換。
8位字符比較
在QByteArray中,大寫和小寫以及哪個(gè)字符大于或小于另一個(gè)字符的概念與語言環(huán)境有關(guān)。這會(huì)影響支持不區(qū)分大小寫選項(xiàng)的函數(shù)或比較小寫或大寫參數(shù)的函數(shù)。如果兩個(gè)字符串僅包含ASCII字符,則不區(qū)分大小寫的操作和比較將是準(zhǔn)確的。影響的函數(shù)contains(),indexOf(),lastIndexOf(),運(yùn)算符<(),運(yùn)算符<=(),運(yùn)算符>(),運(yùn)算符> =(),toLower()和toUpper()。
此問題不適用于QStrings,因?yàn)樗褂肬nicode的字符。
另請(qǐng)參閱QString和QBitArray。
1.2 設(shè)置數(shù)組字節(jié)大小
void QByteArray::resize(int size)
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組All_data.resize(888); //指定字節(jié)大小
1.3 返回?cái)?shù)組大小
int QByteArray::length() const
int QByteArray::size() const
int QByteArray::count() const
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清除字節(jié)數(shù)組的內(nèi)容并使其為空。
All_data.append("123456789");
qDebug()<<All_data.size(); //結(jié)果: 9
qDebug()<<All_data.length(); //結(jié)果:9
1.4 將數(shù)據(jù)轉(zhuǎn)為其他類型
double QByteArray::toDouble(bool * ok = 0) const
float QByteArray::toFloat(bool * ok = 0) const
QByteArray QByteArray::toHex() const
int QByteArray::toInt(bool * ok = 0, int base = 10) const
long QByteArray::toLong(bool * ok = 0, int base = 10) const
qlonglong QByteArray::toLongLong(bool * ok = 0, int base = 10) const
示例:
QByteArray string("1234.56");double a = string.toDouble(); // a == 1234.56
1.5 將數(shù)據(jù)轉(zhuǎn)為C語言的字符指針返回
const char * QByteArray::data() const
1.6 數(shù)組數(shù)據(jù)追加
相關(guān)函數(shù):
QByteArray &prepend(char c);
QByteArray &prepend(int count, char c);
QByteArray &prepend(const char *s);
QByteArray &prepend(const char *s, int len);
QByteArray &prepend(const QByteArray &a);
QByteArray &append(char c);
QByteArray &append(int count, char c);
QByteArray &append(const char *s);
QByteArray &append(const char *s, int len);
QByteArray &append(const QByteArray &a);
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清除字節(jié)數(shù)組的內(nèi)容并使其為空。
All_data.append("123");
All_data.append("456");
All_data.append("789");
qDebug()<<All_data; //結(jié)果123456789
1.7 清除數(shù)組數(shù)據(jù)為指定值
QByteArray &fill(char c, int size = -1); //賦值為指定值
void clear(); //將數(shù)組清除為0
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.fill('8'); //將數(shù)組整體空間數(shù)據(jù)賦值為指定數(shù)據(jù)’8’
qDebug()<<All_data;
1.8 數(shù)組數(shù)據(jù)插入
相關(guān)函數(shù):
QByteArray &insert(int i, char c);
QByteArray &insert(int i, int count, char c);
QByteArray &insert(int i, const char *s);
QByteArray &insert(int i, const char *s, int len);
QByteArray &insert(int i, const QByteArray &a);
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清除字節(jié)數(shù)組的內(nèi)容并使其為空。
All_data.append("123");
All_data.append("456");
All_data.append("789");
All_data.insert(2,"abcd"); //從第2個(gè)位置插入數(shù)據(jù)
qDebug()<<All_data; //結(jié)果"12abcd3456789"
1.9 刪除指定位置指定長度的數(shù)據(jù)
QByteArray &remove(int index, int len);
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清除字節(jié)數(shù)組的內(nèi)容并使其為空。
All_data.append("123");
All_data.append("456");
All_data.append("789");
All_data.remove(3,3); //從第3個(gè)位置刪除3個(gè)數(shù)據(jù)
qDebug()<<All_data; //結(jié)果"123789"
1.10 替換指定位置的數(shù)據(jù)
相關(guān)函數(shù):
QByteArray &replace(int index, int len, const char *s);
QByteArray &replace(int index, int len, const char *s, int alen);
QByteArray &replace(int index, int len, const QByteArray &s);
QByteArray &replace(char before, const char *after);
QByteArray &replace(char before, const QByteArray &after);
QByteArray &replace(const char *before, const char *after);
QByteArray &replace(const char *before, int bsize, const char *after, int asize);
QByteArray &replace(const QByteArray &before, const QByteArray &after);
QByteArray &replace(const QByteArray &before, const char *after);
QByteArray &replace(const char *before, const QByteArray &after);
QByteArray &replace(char before, char after);
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清除字節(jié)數(shù)組的內(nèi)容并使其為空。
All_data.append("123456789");
All_data.replace(3,3,"abc"); //將第3個(gè)位置后的3個(gè)數(shù)據(jù)替換為abcqDebug()<<All_data; //結(jié)果"123abc789"
1.11 數(shù)組數(shù)據(jù)查找
int QByteArray::indexOf(const QByteArray &ba, int from = 0) const
返回此字節(jié)數(shù)組中第一個(gè)出現(xiàn)字節(jié)數(shù)組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
1.12 去除空白字符
QByteArray QByteArray::simplified() const
返回一個(gè)從開始和結(jié)束中刪除空白的字節(jié)數(shù)組,其中每個(gè)內(nèi)部空白序列都用一個(gè)空格替換。
空白表示標(biāo)準(zhǔn)C ++ isspace()函數(shù)在C語言環(huán)境中返回true的任何字符。這包括在ASCII語言環(huán)境中的ASCII isspace()函數(shù)返回true。這包括ASCII字符’\ t’,‘\ n’,‘\ v’,‘\ f’,‘\ r’和’ '。
QByteArray QByteArray::trimmed() const
返回從開始和結(jié)束刪除空白的字節(jié)數(shù)組。
空白表示標(biāo)準(zhǔn)C ++ isspace()函數(shù)在C語言環(huán)境中返回true的任何字符。這包括ASCII字符’\ t’,‘\ n’,‘\ v’,‘\ f’,‘\ r’和’ '。
示例:
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清空數(shù)組All_data.append("*1024,24.56\n");
All_data.append("#12345678\n");qDebug()<<All_data; //原始結(jié)果:"*1024,24.56\n#12345678\n"
qDebug()<<All_data.simplified();//去除所有的空白字符,結(jié)果:"*1024,24.56 #12345678"
qDebug()<<All_data.trimmed(); //去掉結(jié)尾的空白字符,結(jié)果:"*1024,24.56\n#12345678"
1.13 QBuffer類介紹
1.13.1QBuffer基本使用介紹
說明: QBuffer主要解決,char*類型的值。
QBuffer類為QByteArray提供QIODevice接口。
QBuffer允許你使用QIODevice接口訪問QByteArray。
QByteArray被視為一個(gè)標(biāo)準(zhǔn)的隨機(jī)訪問文件。
例:
QBuffer buffer;
char ch;
buffer.open(QBuffer::ReadWrite);
buffer.write("Qt rocks!");
buffer.seek(0);
buffer.getChar(&ch); // ch == 'Q'
buffer.getChar(&ch); // ch == 't'
buffer.getChar(&ch); // ch == ' '
buffer.getChar(&ch); // ch == 'r'
默認(rèn)情況下,創(chuàng)建QBuffer時(shí)為您創(chuàng)建一個(gè)內(nèi)部QByteArray緩沖區(qū)。你可以通過調(diào)用buffer()直接訪問這個(gè)緩沖區(qū)。 你也可以通過調(diào)用setBuffer()或者將你的數(shù)組傳遞給QBuffer的構(gòu)造函數(shù)來將QBuffer與現(xiàn)有的QByteArray一起使用。
調(diào)用open()打開緩沖區(qū)。 然后調(diào)用write()或putChar()寫入緩沖區(qū),并通過read(),readLine(),readAll()或getChar()從中讀取。 Size()返回緩沖區(qū)的當(dāng)前大小,你可以調(diào)用seek()來尋找緩沖區(qū)中的任意位置。 當(dāng)你完成訪問緩沖區(qū)時(shí),調(diào)用close()關(guān)閉釋放緩沖區(qū)。
以下代碼片段顯示了如何使用QDataStream和QBuffer將數(shù)據(jù)寫入QByteArray:
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);QDataStream out(&buffer);
out << QApplication::palette();
實(shí)際上,我們可以將應(yīng)用程序的QPalette轉(zhuǎn)換為一個(gè)字節(jié)數(shù)組。
以下是如何從QByteArray中讀取數(shù)據(jù)的方法:
QPalette palette;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::ReadOnly);QDataStream in(&buffer);
in >> palette;
QTextStream和QDataStream還提供了便捷的構(gòu)造函數(shù),它們使用QByteArray并在后臺(tái)創(chuàng)建QBuffer。
當(dāng)新數(shù)據(jù)到達(dá)緩沖區(qū)時(shí),QBuffer發(fā)射readyRead()信號(hào)。 通過連接這個(gè)信號(hào),你可以在處理之前使用QBuffer來存儲(chǔ)臨時(shí)數(shù)據(jù)。每次新數(shù)據(jù)寫入緩沖區(qū)時(shí),QBuffer也會(huì)發(fā)送bytesWritten()。
另請(qǐng)參閱QFile,QDataStream,QTextStream和QByteArray。
1.13.2 數(shù)據(jù)讀寫示例
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清空數(shù)組QBuffer buffer;
buffer.setBuffer(&All_data); //將QByteArray空間設(shè)置給QBuffer
char ch;
buffer.open(QBuffer::ReadWrite); //讀寫權(quán)限打開
buffer.write("123456789");buffer.seek(0); //移動(dòng)到空間第0個(gè)位置buffer.getChar(&ch); // ch == '1'
qDebug()<<ch;buffer.getChar(&ch); // ch == '2'
qDebug()<<ch;qDebug()<<buffer.readAll(); //讀取空間全部數(shù)據(jù) ,結(jié)果:"3456789"buffer.seek(0); //移動(dòng)到空間第0個(gè)位置
qDebug()<<buffer.readAll(); //讀取空間全部數(shù)據(jù) ,結(jié)果:"123456789"
1.13.3 數(shù)據(jù)處理一行的數(shù)據(jù)
QByteArray All_data; //創(chuàng)建字符數(shù)組
All_data.resize(1024); //指定字節(jié)大小
All_data.clear(); //清空數(shù)組QBuffer buffer;
buffer.setBuffer(&All_data); //將QByteArray空間設(shè)置給QBuffer
char ch;
buffer.open(QBuffer::ReadWrite); //讀寫權(quán)限打開
buffer.write("123\n456\n789\n");
buffer.seek(0); //移動(dòng)指針為到0
if(buffer.canReadLine())//判斷是否可以讀取一行數(shù)據(jù)
{qDebug()<<buffer.readLine(); //結(jié)果:"123\n"
}