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. 磁盘sda,hda,sda1,并行,串行

    1.sd,hd表示硬盘, a表示第一块盘, 1表示硬盘上的第一个分区 2.sd是Serial ATA Disk ,表示硬盘是scsi,SATA串行接口 hd是 hard disk,表示硬盘是IDE(也 ...

  2. 浅谈kali : aircrack-ng套件

    aircrack-ng Aircrack-ng是一个与802.11标准的无线网络分析有关的安全软件,主要功能有:网络侦测,数据包嗅探,WEP和WPA/WPA2-PSK破解.Aircrack-ng可以工 ...

  3. 报错org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.mybatis.spring.SqlSessionFactoryBean]

    超级大坑 org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.mybati ...

  4. nginx二进制安装

    目录 一:二进制安装nginx 1.下载CentOS源 2.安装CentOS源 3.下载epel源(失败显示未找到命令) 4.解决依赖 5.安装Epel源 6.安装nginx 一:二进制安装nginx ...

  5. 【存】008 Linux 文件查找 find

    01 一起来认识 find! 在 Linux 系统,find 毫无疑问是最强的文件查找工具.find 一般会与其他命令结合,将查找到的结果作为参数传入到后置命令中,进行删除.统计.复制迁移等操作. 0 ...

  6. numpy 矩阵在作为函数参数传递时的奇怪点

    numpy 矩阵在作为函数参数传递时的奇怪点 import numpy as np class simpleNet: def __init__(self): self.W = np.array([1, ...

  7. UIView属性的讲解

    1.父控件和子控件的理解在storyboard中只有UIView是可以在里面拖入子控件的,其他控件不可以(必须通过代码添加)拖入一个UIView控件,在里面添加一些子控件(UIView控件是控制器的V ...

  8. EasyExcel小试牛刀

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12029411.html 某种偶然的机会遇到了这个插件, 听说很牛X, 我之前也不知道, 不过还 ...

  9. Javascript疑问【长期更新】

    1.插入 Javacript 的正确位置是? 答:<body> 部分和 <head> 部分均可. 2.外部脚本必须包含 <script> 标签吗? 答:外部脚本不能 ...

  10. 随机数类 Random

    import java.util.Random; /* 随机数类 Random 需求: 编写一个函数随机产生四位的验证码. */ public class Demo5 { public static ...