0、说明

QByteArray是存储二进制byte数组。

区别于QString:QByteArray中存储的全是byte,而QString中存储的全是16 bit Unicode码。QString是在Qt API中从头到尾都用的,而QByteArray则用于以下两种情况:①存储原始二进制数据;②内存保护很严格的时候(也就是说,不能乱用空间以免冗余)。

构造QByteArray(一)

第一种构造QByteArray的方法是,简单地把const char *传入构造函数参数中。例如:

QByteArray ba("Hello");

本例中QByteArray的size()会返回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()方法会统计整个Array的size,包括嵌入的'\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是大小为0的Array,而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处

Qt:QByteArray的更多相关文章

  1. QT:QByteArray和QByteArray、char *(转)

    //常用参数类型:char *字符串, QByteArray字符数组, QString字符串//需要转换:char * ---转--- QByteArray ---需要调用QByteArray类的构造 ...

  2. QT之QByteArray

    1.拷贝内容到QByteArray 1.使用append函数 //结合结构体的(char*)强制转化使用,command.append((char*)&e2_System_Para_t, si ...

  3. Qt:QNetworkReply

    0.说明 QNetworkReply对象包含了Manager发送的请求头和返回的数据. 它继承自QIODevice,所以可以用各种read获取其中返回的数据: QByteArray data = re ...

  4. Qt:QJsonDocument以及与QJsonArray、QJsonObject、QJsonValue的关联

    0.说明 QJsonDocument类提供了read/write JSON文档的方法. 用QJsonDocument::fromJson()方法,可以从将一个JSON文件(或者QByteArray数据 ...

  5. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  6. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  7. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  8. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  9. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

随机推荐

  1. 分页方法需要参数(当前页数,总数据量,拿到query的值)

    class Pagination: def __init__(self, page_num, all_count ,params=None,per_num=10,max_show=11): " ...

  2. python 小兵(4)之文件操作 小问题

    1.光标不对就用seek 2.文件操作方面注意不要变修改变删除,会爆出文件正在运行不能操作 3.w模式下只有开始打开的时候会清空 4.文件操作的时候用as 后面的参数进行操作,不能用文件名进行操作 5 ...

  3. 中文分词,自然语言处理器NLP。 六月份版本已上线。

    一,  没有对比,就没有伤害,我们分词的优势在哪里?走一波测试. 跑一下CaCl2,看看效果. 二   想要分什么词汇,自己自定义即可. 目前每个月都会出一个新的版本,主要是和金融相关的词汇. 这是6 ...

  4. 使用JMX Exporter监控Rainbond上的Java应用

    场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据.当您的 Java 应用部署在Rainbond上后 可通过 ...

  5. Spring Security过滤器链体系

    以下摘自胖哥分享的 2022开工福利教程. 在学习Spring Security的时候你有没有下面这两个疑问: Spring Security的登录是怎么配置的? Spring Security的访问 ...

  6. UDP数据包最大传输长度

    概念以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节被称为链路层的MTU(最大传输单元). 但这并不是指链路层的长度被限制在1500字 ...

  7. 自动归档autoArchive By H.l

    写点简单的代码,让开发更简单 详情:ios 应用实现快速的临时缓存之模型的自动归档 Demo:https://files.cnblogs.com/files/sixindev/AutoArchiver ...

  8. 【BZOJ5492】校园旅行(图论 搜索优化)

    题目链接 大意 给出\(N\)个点,\(M\)条边的一张图,其中每个点都有一个0或1的颜色. 再给出\(Q\)个询问,每次询问查询两个点之间是否存在一条路径,使得路径上的颜色组成的01字符串是一个回文 ...

  9. webhook触发jenkins进行sonar检测

    目的 jenkins仅需创建一个job,git推送后自动进行sonar代码检测并上传到sonarqube jenkins插件 已按社区推荐安装基本插件 Generic Webhook Trigger ...

  10. 框架4--NFS网络共享

    目录 框架4--NFS网络共享 1.练习 2.昨日问题 3.今日内容 4.NFS简介 5.NFS应用 6.NFS实践 6.1.服务端 6.2.客户端 7.NFS配置详解 8.搭建考试系统 8.1.搭建 ...