qtqbytearray类_QByteArray 类 - 最方便的字符数组类

QByteArray是Qt提供的一种方便的字符数组操作类,不同于QString,它存储的是未经编码的原始数据。本文详细介绍了QByteArray的初始化、数组信息、增删改查、宏等操作,包括如何创建、设置容量、查找、删除、修改内容等,并提供了函数分类,便于理解和应用。
摘要由CSDN通过智能技术生成

本文结构如下:概述

函数详解初始化

数组信息

增/删/改/查

附:所有函数

概述

啥是字符数组?字符串呗。一般我们用 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值