本文结构如下:概述
函数详解初始化
数组信息
增/删/改/查
宏
附:所有函数
概述
啥是字符数组?字符串呗。一般我们用 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(); // trueQByteArray("").isEmpty(); // trueQByteArray("abc").isEmpty(); // false
QByteArray().isNull(); // trueQByteArray("").isNull(); // falseQByteArray("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 clea