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. 利用JGrapht对有向无环图进行广度优先遍历

    环境需求:JDK:1.8 jar:jgrapht-core-1.01.jar package edu; import org.jgrapht.experimental.dag.DirectedAcyc ...

  2. Vue之 watch、computed、filter之间的区别与使用场景

    computed  计算属性: 当页面中需要使用大量的表达式处理数据时,为了页面维护更加简单,所以使用 计算属性 来出来复杂的逻辑运算 watch 侦听器 当需要在数据变化时执行异步或开销较大的操作时 ...

  3. vscode配置golang开发环境

    软件: go1.16.5.windows-amd64.msi vscode go安装后已经自动配置相关环境变量.在cmd中用go env查看环境变量. vscode设置goroot和gopath 找到 ...

  4. 「JOISC 2014 Day1」 历史研究

    「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...

  5. JQuery高级部分

    简介 对动画.遍历.事件绑定的介绍. 操作 动画 三种方式显示和隐藏元素 show([speed,[easing],[fn]]) 默认显示和隐藏方式 参数: speed:动画的速度.三个预定义的值(& ...

  6. lua语言:string

    转载请注明来源:https://www.cnblogs.com/hookjc/ 字符串库函数string.len(s)          返回字符串s的长度:string.rep(s, n)      ...

  7. vue单页面应用打包后相对路径、绝对路径相关问题

    原文链接:  vue单页面应用打包后相对路径.绝对路径相关问题展开       在项目开发过程中,在部署过程中,用到了反向代理,这就要求前端代码中不能使用绝对路径.但是我们知道,一般情况下,通过web ...

  8. Springboot+Redisson自定义注解一次解决重复提交问题(含源码)

    前言   项目中经常会出现重复提交的问题,而接口幂等性也一直以来是做任何项目都要关注的疑难点,网上可以查到非常多的方案,我归纳了几点如下:   1).数据库层面,对责任字段设置唯一索引,这是最直接有效 ...

  9. Git忽略文件.gitignore的使用

    本博客旨在自我学习使用,如有任何疑问请及时联系博主 1.WHY? 当你使用git add .的时候有没有遇到把你不想提交的文件也添加到了缓存中去?比如项目的本地配置信息,如果你上传到Git中去其他人p ...

  10. JavaGuide--Java篇

    本文避免重复造轮子,也是从JavaGuider中提取出来方便日后查阅的手册 参考链接: JavaGuider:https://javaguide.cn/java/basis/java-basic-qu ...