QByteArray使用
QByteArray是一个能够方便地处理字节数组和二进制数据的类。它可以被看作是一种字符数组,但与QString类似,它并不支持Unicode编码,而主要用于存储和传输各种非文本数据,比如二进制文件、音频视频数据等。QByteArray能够方便地进行数组的增删改查、转换、加密、网络传输等操作。QByteArray在数据存储和通信方面都是一个可靠易用的工具,在QT框架里广泛应用。通过该类的使用,我们
QByteArray介绍
QByteArray是一个能够方便地处理字节数组和二进制数据的类。它可以被看作是一种字符数组,但与QString类似,它并不支持Unicode编码,而主要用于存储和传输各种非文本数据,比如二进制文件、音频视频数据等。QByteArray能够方便地进行数组的增删改查、转换、加密、网络传输等操作。
QByteArray在数据存储和通信方面都是一个可靠易用的工具,在QT框架里广泛应用。通过该类的使用,我们可以更加方便、简洁地实现对二进制数据的存储和传输。
-
数据存储:QByteArray类可以很方便地把内存中的二进制数据保存到磁盘或者网络上。通过这个类可以把一个二进制数据转化为字节数组的形式来存储,同时也可以从已有的字节数组中恢复回原始的二进制数据。
-
数据通信:在网络通信中,QByteArray类可以用于传输二进制数据。与文本数据不同,二进制数据在传输过程中不受字符编码的限制,所以可以确保传输过程中数据的完整性。在Qt中使用该类来处理二进制数据可以让开发者更快捷、直观地完成二进制数据的读写、转换和编解码等工作。
QByteArray常用接口
以下是QByteArray的一些常用接口及其作用:
- QByteArray():构造函数,创建一个空的QByteArray对象
- QByteArray(const char * data, int size = -1):构造函数,使用data指针中的数据和size指定的大小初始化QByteArray对象
- append(const char * data, int size):将data指向的二进制数据添加到QByteArray末尾
- prepend(const char * data, int size):将data指向的二进制数据添加到QByteArray开头
- insert(int pos, const char * data, int size):在QByteArray中的pos位置插入data指向的二进制数据
- remove(int pos, int len):从QByteArray中删除由pos位置开始、长度为len的一段二进制数据
- clear():清空QByteArray中的所有数据
- count():获取QByteArray中的数据字节数
- truncate(int pos):缩短QByteArray的大小,使其包含pos个字节
- resize(int size):调整QByteArray的大小
- toBase64():将QByteArray转换为Base64编码的字符串,用于加密或网络传输
- fromBase64(const QByteArray & base64):将Base64编码的字符串转换为QByteArray
- at(int i):返回QByteArray中第i个字节的引用,可以进行修改
- operator[](int i):返回QByteArray中第i个字节的值
- left(int len) / right(int len) / mid(int pos, int len):分别返回QByteArray中左数、右数、指定位置开始、长度为len的一段二进制数据
- indexOf(char c, int from = 0) / lastIndexOf(char c, int from = -1):分别返回QByteArray中字符c(字节)出现的第一个/最后一个位置的索引
- contains(const QByteArray & ba):判断QByteArray中是否包含ba这个子串
QByteArray用法
#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建字节数组
QByteArray ba1 = "Hello, world!"; // 直接初始化
QByteArray ba2("Qt is awesome", 15); // 使用字符数组和长度初始化
QByteArray ba3(10, 'A'); // 使用长度和默认值初始化
// 打印内容
qDebug() << ba1; // "Hello, world!"
qDebug() << ba2; // "Qt is awesome"
qDebug() << ba3; // "AAAAAAAAAA"
// 插入和删除数据
ba1.insert(7, ", "); // 插入字符串
ba1.remove(12, 1); // 删除单个字符
qDebug() << ba1; // "Hello, , world"
// 获取子字节数组
QByteArray ba4 = ba1.left(5); // 从左边起取前五个字符
QByteArray ba5 = ba2.right(7); // 从右边起取后七个字符
QByteArray ba6 = ba3.mid(3, 4); // 从第四个字符开始,取连续四个字符
qDebug() << ba4; // "Hello"
qDebug() << ba5; // "awesome"
qDebug() << ba6; // "AAAA"
// 修改内容
ba4[0] = 'h'; // 将'H'改为'h'
ba2.replace(3, 2, "rocks"); // 将"is"替换为"rocks"
qDebug() << ba4; // "hello"
qDebug() << ba2; // "Qt rocks awesome"
// 搜索字符串
int idx1 = ba1.indexOf("world"); // 查找子串的起始位置
int idx2 = ba2.lastIndexOf("o"); // 从后往前查找字符出现的位置
qDebug() << idx1; // 8
qDebug() << idx2; // 10
// 转换为Base64编码
QByteArray ba7 = ba1.toBase64();
qDebug() << ba7; // "SGVsbG8sIHdvcmxkIQ=="
// 从Base64编码解码
QByteArray ba8 = QByteArray::fromBase64(ba7);
qDebug() << ba8; // "Hello, , world"
// 将字符串转换成数值类型
QByteArray str1 = "1234";
QByteArray str2 = "-3.14";
int intVal = str1.toInt();
long long longLongVal = str1.toLongLong();
float floatVal = str2.toFloat();
double doubleVal = str2.toDouble();
qDebug() << intVal; // 1234
qDebug() << longLongVal; // 1234
qDebug() << floatVal; // -3.14
qDebug() << doubleVal; // -3.14
// 将数值类型转换成字符串
int intValue = 5678;
float floatValue = -1.23;
QByteArray intStr = QByteArray::number(intValue);
QByteArray floatStr = QByteArray::number(floatValue);
qDebug() << intStr; // "5678"
qDebug() << floatStr; // "-1.23"
return a.exec();
}
注意事项
在使用QByteArray时,需要注意一些事项,以保证程序的安全和性能:
-
内存管理:QByteArray会自动分配和释放内存,但是过多的动态分配内存会影响程序的性能,尤其是在频繁创建和销毁QByteArray对象的情况下。因此,在使用QByteArray时应尽量避免在循环中频繁地创建或者重新赋值对象。
-
数据复制:QByteArray提供了许多操作方法,比如append、insert等,这些方法可能会涉及到数据复制。对于大规模的二进制数据,过多的数据复制会影响程序的性能。为了减少数据复制,可以使用reserve()预分配空间,然后通过setRawData()等方法更新数据。
-
编码问题:QByteArray同时支持文本和二进制数据,使用setText()和text()方法可以将二进制数据转换为文字,或将文字转换为二进制数据。在进行编码转换时,需要确保编码方式正确,并做好异常处理。
-
安全问题:QByteArray在存储二进制数据时禁止出现空字符,否则容易导致缓冲区溢出漏洞。此外,在进行网络通信时,要对接收到的数据进行校验,防止受到攻击。
另外,在QByteArray文档中也有详细的说明,建议在使用时先了解相关文档。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)