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处

 

isNull()

Qt:QByteArray

上一篇:C# 实现单链表


下一篇:windows平台 pypi打包分发 2019