QByteArray是存储二进制byte数组。
区别于QString:QByteArray中存储的全是byte,而QString中存储的全是16 bit Unicode码。QString是在Qt API中从头到尾都用的,而QByteArray则用于以下两种情况:①存储原始二进制数据;②内存保护很严格的时候(也就是说,不能乱用空间以免冗余)。
第一种构造QByteArray的方法是,简单地把const char *传入构造函数参数中。例如:
QByteArray ba("Hello");
本例中QByteArray的size()会返回5,不过在该Byte Array末尾还会保留一个额外的'\0'字符。
QByteArray会对const char *数据采取深拷贝的策略,所以处理它时不用考虑边际效应(即末尾的'\0')。如果不想深拷贝,可以使用QByteArray::fromRawData()。
第二种构造方法是,先定义对象,再用resize()设置大小,再为每个byte赋值。
这种情况用得少,这里不再多说,有需要可以去官网查看。
为了访问指定位置上的byte,可以用类似array[ i ]的语法形式,用法和char[ ]相同。也可以用at( i )方法,功能与[ ]相同,但是速度上更快,因为at()不会引起深拷贝。
为了一次提取多个bytes,可以用left()、right()、mid()方法。
在QByteArray中可以在中间嵌入'\0'。但是size()方法会统计整个Array的size,包括嵌入的'\0',但是会排除最后的结尾符'\0'。
如果想知道直到第一个'\0'的data长度,可以调用qstrlen()方法。
在调用resize()后,多分配的bytes中存放的是一些undefined值。为了给所有bytes填充一个值,可以调用fill()方法。
为了获取指向实际数据的指针,可以调用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()方法。
如果我们想查找某个字符或子串,可以用indexOf()与lastIndexOf()方法:前者是从指定位置开始正向查找,后者则是从指定位置逆向查找。找到时返回字符或子串的索引位置,否则返回-1。例如,下文给出了查找特定子串经典语句:
QByteArray ba("We must be bold, very bold");
int j = 0;
while ((j = ba.indexOf("", j)) != -1) {
cout << "Found tag at index position " << j << Qt::endl;
++j;
}
如果我们想简单地查看是否包含特定字符或子串,可以用contains()方法。如果我们想看包含特定字符或子串的数量,可以用count()方法。
如果我们想替换特定字符或子串,可以用只有两个参数的replace()方法。
可以用重载运算符如<、<=、==、>=、>、!=比较两个QByteArray。比较是基于各个字符的对应的int数值。对于String的比较与排序,则用QString::localAwareCompare()。
由于某些历史原因,QByteArray对null和空Array分别对待。空Array是大小为0的Array,而null是空指针。通过isNull()、isEmpty()进行检查。
当前版本的QByteArray限制大小为2GB(2^31B bytes)。
Header:
#include
qmake:
QT += core
QByteArray(QByteArray other)
构造并指向另一个QByteArray的副本
QByteArray(int size, char ch)
构造一个大小为size,每个byte都设置为ch的Array
QByteArray(const char *_data_, int size = -1)
构造一个包含data前size字节的Array
构造一个空Array
class
FromBase64Result
Base64解码
enum
Base64Option
Base64编码解码
flags
Base64Options
typedef
const_iterator
在QByteArray上的STL样式的const迭代器
typedef
在QByteArray上的STL样式的const逆向迭代器
typedef
在QByteArray上的STL样式的非const迭代器
typedef
在QByteArray上的STL样式的非const逆向迭代器
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
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 *
返回该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
用于STL兼容性。
等同于squeeze()。
QByteArray
移除首尾空白符、将文中的连续空白符合并为1个。
int
size()
Array中的字符数(不包含末尾的'\0')
QList
split(char sep)
用指定分割符将串分割,得到分割后的子串构成的QList
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处
手机扫一扫
移动阅读更方便
你可能感兴趣的文章