https://zhuanlan.zhihu.com/p/51728642
本文结构如下:
- 概述
- 函数详解
- 初始化
- 数组信息
- 增/删/改/查
- 宏
- 附:所有函数
概述
啥是字符数组?字符串呗。一般我们用 C++ 的 const char* 来指向一个字符数组,但是操作起来非常的不方便。Qt 提供了 QByteArray 类专门用于字符数组的操作,而且它的结尾始终跟着‘\0’。
注意啊,它和 QString 不是一个东西。QString 里面存的是 Unicode 编码的字符串,而 QByteArray 没有经过编码,是原始的数据。使用 QString 类的场合多,是因为 Qt 的很多函数参数是 QString,另一方面 QString 类可以很方便的存储非 ASCII、非 Latin-1 字符。
其实函数用起来很简单,本文的重点在于“附:所有函数”的分类方法,可以加到自己的笔记本里方便以后快速查用。
函数详解
初始化
QByteArray()
QByteArray(const char *data, int size = -1)
QByteArray(int size, char ch)
QByteArray(const QByteArray &other)
QByteArray(QByteArray &&other)
交换:void swap(QByteArray &other)
实际工程中常用的是第二个构造函数,因为有了指针,所以我们知道了数据在内存中的开头位置,那么用 size 指定我们要多少数据即可。需要说明的是,默认 size 为负,那么 QByteArray 在构造的时候遇到第一个‘\0’空字符时停止。所以如果你要载入的数据中确实有‘\0’的话,需要手动指定 size,否则空字符后面的数据是不会被加载进来的。
关于 swap(),就是交换两个字符数组,执行速度非常的快。
数组信息
是否空
bool isEmpty() const
bool isNull() const
由于历史原因,虽然都是空,但 Qt 对字符数组区分了 null 和 empty。我们其实关注的是有没有数据,所以一般就用 isEmpty() 就可以了。如果非要想知道区别,可以看以下代码感受一下:
QByteArray().isEmpty(); // true
QByteArray("").isEmpty(); // true
QByteArray("abc").isEmpty(); // false
QByteArray().isNull(); // true
QByteArray("").isNull(); // false
QByteArray("abc").isNull(); // false
容量
获取
内存大小:int capacity() const
字符大小:int count() const == int size() const == int length() const
设置
不填充:void reserve(int size)
填充:void resize(int size)
释放不需要的空间
void squeeze()
void shrink_to_fit()
关于容量大小,因为每个字符占用一个空间,所以一般分配的内存空间大于数据的字节数,这样才能存放所有的字符。因此,capacity() 函数返回分配的内存空间大小;count()、size()、length() 三者效果一模一样,返回的是字符的数量,当然一个字符是1个字节,因此也可以说是数据的大小。
关于设置容量,一般我们不需要做这样的操作,QByteArray 会自动管理的。但是 Qt 还是给我们开放了调整分配内存空间大小的函数 reserve() 和 resize()。两者都可以重新调整空间容量,区别在于 reserve() 不会在多余的空间中填充字符,而 resize() 扩大容量后会在多余的空间均填充一些字符,而且填充的字符不确定。
关于释放,squeeze() 等价于 shrink_to_fit()。作用就是当分配容量大于字符数量时,将多余的空间释放掉。
指向数据的指针
char * data()
const char * data() const
const char * constData() const
QByteArray & setRawData(const char *data, uint size)
[static]QByteArray fromRawData(const char *data, int size)
关于 data(),返回指向 QByteArray 中字符数组数据的指针,只要不重新分配空间或者销毁,该指针就保持有效。
关于 constData(),如果只读的话该函数非常快,不会导致深层复制。不过一般该函数用于的场合是那些需要 const char* 参数的地方。
关于 setRawData() 和 fromRawData(),两个函数都是从原始数据中构造 QByteArray。看参数是 const char*,说明无论怎么构建 QByteArray,都不会对数据源进行修改,因为隐式共享的原因,只要用 QByteArray 修改一个字符,就会引发深拷贝。
增/删/改/查
删除
前后
删除后n个字符:void chop(int n)
保留前n个字符:void truncate(int pos)
中间:QByteArray &remove(int pos, int len)
删除所有字符:void clear()
去除空白
QByteArray simplified() const
QByteArray trimmed() const
关于 simplified(),作用是删除字符串头尾的空白,同时将字符串中间有空白的地方均用一个空格替换。例如“ lots\t of\nwhitespace\r\n ”->“lots of whitespace”。
关于 trimmed(),作用是仅删除字符串头尾的空白。
查找
判断数组中的内容
是否包含
开头
bool startsWith(const QByteArray &ba) const
bool startsWith(char ch) const
bool startsWith(const char *str) const
中间任意位置
bool contains(const QByteArray &ba) const
bool contains(const char *str) const
bool contains(char ch) const
结尾
bool endsWith(const QByteArray &ba) const
bool endsWith(char ch) const
bool endsWith(const char *str) const
包含的字符所在位置
int indexOf(const QByteArray &ba, int from = 0) const
int indexOf(const char *str, int from = 0) const
int indexOf(char ch, int from = 0) const
int indexOf(const QString &str, int from = 0) const
int lastIndexOf(const QByteArray &ba, int from = -1) const
int lastIndexOf(const char *str, int from = -1) const
int lastIndexOf(char ch, int from = -1) const
int lastIndexOf(const QString &str, int from = -1) const
出现次数
int count(const QByteArray &ba) const
int count(const char *str) const
int count(char ch) const
提取内容
单个字符
第一个
char front() const
QByteRef front()
中间
char at(int i) const
char operator[](uint i) const
char operator[](int i) const
QByteRef operator[](int i)
QByteRef operator[](uint i)
最后一个
char back() const
QByteRef back()
字符串
直接提取
左:QByteArray left(int len) const
中:QByteArray mid(int pos, int len = -1) const
右:QByteArray right(int len) const
删除后提取
QByteArray chopped(int len) const
切分:QList<QByteArray> split(char sep) const
关于查找,主要包含判断内容和内容提取两部分。判断内容就是字符数组中是否包含某某字符之类的,内容提取就是从字符串中获取子字符串内容。
宏
QByteArrayLiteral(ba)
QT_NO_CAST_FROM_BYTEARRAY
关于 QByteArrayLiteral,作用就是在编译期构造好 QByteArray,而无需在运行期再去构造。如下代码所示,在程序运行的时候,第一个代码会创建临时的 QByteArray 而第二个代码不需要,因为它已经在我们编译的时候就创建好了。
if (node.hasAttribute("length"))
if (node.hasAttribute(QByteArrayLiteral("length")))
关于 QT_NO_CAST_FROM_BYTEARRAY,就是禁用从 QByteArray 到 const char * 或 const void * 的自动转换。
附:所有函数
初始化
QByteArray()
QByteArray(const char *data, int size = -1)
QByteArray(int size, char ch)
QByteArray(const QByteArray &other)
QByteArray(QByteArray &&other)
交换:void swap(QByteArray &other)
数组信息
是否空
bool isEmpty() const
bool isNull() const
容量
获取
内存大小:int capacity() const
字符大小:int count() const == int size() const == int length() const
设置
不填充:void reserve(int size)
填充:void resize(int size)
释放不需要的空间
void squeeze()
void shrink_to_fit()
指向数据的指针
char * data()
const char *data() const
const char *constData() const
QByteArray &setRawData(const char *data, uint size)
[static]QByteArray fromRawData(const char *data, int size)
增/删/改/查
增加
从前面
QByteArray &prepend(const QByteArray &ba)
QByteArray &prepend(int count, char ch)
QByteArray &prepend(const char *str)
QByteArray &prepend(const char *str, int len)
QByteArray &prepend(char ch)
void push_front(const QByteArray &other)
void push_front(const char *str)
void push_front(char ch)
从中间
QByteArray &insert(int i, const QByteArray &ba)
QByteArray &insert(int i, int count, char ch)
QByteArray &insert(int i, const char *str)
QByteArray &insert(int i, const char *str, int len)
QByteArray &insert(int i, char ch)
QByteArray &insert(int i, const QString &str)
从后面
QByteArray &append(const QByteArray &ba)
QByteArray &append(int count, char ch)
QByteArray &append(const char *str)
QByteArray &append(const char *str, int len)
QByteArray &append(char ch)
QByteArray &append(const QString &str)
void push_back(const QByteArray &other)
void push_back(const char *str)
void push_back(char ch)
删除
前后
删除后n个字符:void chop(int n)
保留前n个字符:void truncate(int pos)
中间:QByteArray &remove(int pos, int len)
删除所有字符:void clear()
去除空白
QByteArray simplified() const
QByteArray trimmed() const
修改
填充
左:QByteArray leftJustified(int width, char fill = ' ', bool truncate = false) const
全部:QByteArray & fill(char ch, int size = -1)
右:QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const
复制多次:QByteArray repeated(int times) const
替换
QByteArray &replace(int pos, int len, const QByteArray &after)
QByteArray &replace(int pos, int len, const char *after, int alen)
QByteArray &replace(int pos, int len, const char *after)
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 &replace(const QString &before, const char *after)
QByteArray &replace(char before, const QString &after)
QByteArray &replace(const QString &before, const QByteArray &after)
查找
判断数组中的内容
是否包含
开头
bool startsWith(const QByteArray &ba) const
bool startsWith(char ch) const
bool startsWith(const char *str) const
中间任意位置
bool contains(const QByteArray &ba) const
bool contains(const char *str) const
bool contains(char ch) const
结尾
bool endsWith(const QByteArray &ba) const
bool endsWith(char ch) const
bool endsWith(const char *str) const
包含的字符所在位置
int indexOf(const QByteArray &ba, int from = 0) const
int indexOf(const char *str, int from = 0) const
int indexOf(char ch, int from = 0) const
int indexOf(const QString &str, int from = 0) const
int lastIndexOf(const QByteArray &ba, int from = -1) const
int lastIndexOf(const char *str, int from = -1) const
int lastIndexOf(char ch, int from = -1) const
int lastIndexOf(const QString &str, int from = -1) const
出现次数
int count(const QByteArray &ba) const
int count(const char *str) const
int count(char ch) const
提取内容
单个字符
第一个
char front() const
QByteRef front()
中间
char at(int i) const
char operator[](uint i) const
char operator[](int i) const
QByteRef operator[](int i)
QByteRef operator[](uint i)
最后一个
char back() const
QByteRef back()
字符串
直接提取
左:QByteArray left(int len) const
中:QByteArray mid(int pos, int len = -1) const
右:QByteArray right(int len) const
删除后提取
QByteArray chopped(int len) const
切分:QList<QByteArray> split(char sep) const
转换
大小写
bool isLower() const
bool isUpper() const
QByteArray toLower() const
QByteArray toUpper() const
数字
int 型
QByteArray & setNum(int n, int base = 10)
int toInt(bool *ok = nullptr, int base = 10) const
unsigned int 型
QByteArray & setNum(uint n, int base = 10)
uint toUInt(bool *ok = nullptr, int base = 10) const
short 型
QByteArray & setNum(short n, int base = 10)
short toShort(bool *ok = nullptr, int base = 10) const
unsigned short 型
QByteArray & setNum(ushort n, int base = 10)
ushort toUShort(bool *ok = nullptr, int base = 10) const
long long 型
QByteArray & setNum(qlonglong n, int base = 10)
qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
unsigned long long 型
QByteArray & setNum(qulonglong n, int base = 10)
qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
float 型
QByteArray & setNum(float n, char f = 'g', int prec = 6)
float toFloat(bool *ok = nullptr) const
double 型
QByteArray & setNum(double n, char f = 'g', int prec = 6)
double toDouble(bool *ok = nullptr) const
十六进制
QByteArray toHex() const
QByteArray toHex(char separator) const
[static]QByteArray fromHex(const QByteArray &hexEncoded)
Base64
QByteArray toBase64() const
QByteArray toBase64(QByteArray::Base64Options options) const
[static]QByteArray fromBase64(const QByteArray &base64)
[static]QByteArray fromBase64(const QByteArray &base64, QByteArray::Base64Options options)
CFData
CFDataRef toCFData() const
CFDataRef toRawCFData() const
[static]QByteArray fromCFData(CFDataRef data)
[static]QByteArray fromRawCFData(CFDataRef data)
NSData
NSData * toNSData() const
NSData * toRawNSData() const
[static]QByteArray fromNSData(const NSData *data)
[static]QByteArray fromRawNSData(const NSData *data)
URL
QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray(), char percent = '%') const
QByteArray fromPercentEncoding(const QByteArray &input, char percent = '%')
StdString
std::string toStdString() const
[static]QByteArray fromStdString(const std::string &str)
比较字符串
int compare(const char *c, Qt::CaseSensitivity cs = ...) const
int compare(const QByteArray &a, Qt::CaseSensitivity cs = ...) const
游标
QByteArray::iterator begin()
QByteArray::const_iterator begin() const
QByteArray::const_iterator cbegin() const
QByteArray::const_iterator cend() const
QByteArray::const_iterator constBegin() const
QByteArray::const_iterator constEnd() const
QByteArray::const_reverse_iterator crbegin() const
QByteArray::const_reverse_iterator crend() const
QByteArray::iterator end()
QByteArray::const_iterator end() const
QByteArray::reverse_iterator rbegin()
QByteArray::const_reverse_iterator rbegin() const
QByteArray::reverse_iterator rend()
QByteArray::const_reverse_iterator rend() const
非成员相关函数
CRC16校验和
quint16 qChecksum(const char *data, uint len)
quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
解/压缩
QByteArray qCompress(const uchar *data, int nbytes, int compressionLevel = -1)
QByteArray qCompress(const QByteArray &data, int compressionLevel = -1)
QByteArray qUncompress(const uchar *data, int nbytes)
QByteArray qUncompress(const QByteArray &data)
类似C函数
int qsnprintf(char *str, size_t n, const char *fmt, ...)
int qstrcmp(const char *str1, const char *str2)
char *qstrcpy(char *dst, const char *src)
char *qstrdup(const char *src)
int qstricmp(const char *str1, const char *str2)
uint qstrlen(const char *str)
int qstrncmp(const char *str1, const char *str2, uint len)
char *qstrncpy(char *dst, const char *src, uint len)
int qstrnicmp(const char *str1, const char *str2, uint len)
uint qstrnlen(const char *str, uint maxlen)
int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap)
宏
QByteArrayLiteral(ba)
QT_NO_CAST_FROM_BYTEARRAY