QByteArray介绍

QByteArray是一个能够方便地处理字节数组和二进制数据的类。它可以被看作是一种字符数组,但与QString类似,它并不支持Unicode编码,而主要用于存储和传输各种非文本数据,比如二进制文件、音频视频数据等。QByteArray能够方便地进行数组的增删改查、转换、加密、网络传输等操作。

QByteArray在数据存储和通信方面都是一个可靠易用的工具,在QT框架里广泛应用。通过该类的使用,我们可以更加方便、简洁地实现对二进制数据的存储和传输。

  1. 数据存储:QByteArray类可以很方便地把内存中的二进制数据保存到磁盘或者网络上。通过这个类可以把一个二进制数据转化为字节数组的形式来存储,同时也可以从已有的字节数组中恢复回原始的二进制数据。

  2. 数据通信:在网络通信中,QByteArray类可以用于传输二进制数据。与文本数据不同,二进制数据在传输过程中不受字符编码的限制,所以可以确保传输过程中数据的完整性。在Qt中使用该类来处理二进制数据可以让开发者更快捷、直观地完成二进制数据的读写、转换和编解码等工作。

QByteArray常用接口

以下是QByteArray的一些常用接口及其作用:

  1. QByteArray():构造函数,创建一个空的QByteArray对象
  2. QByteArray(const char * data, int size = -1):构造函数,使用data指针中的数据和size指定的大小初始化QByteArray对象
  3. append(const char * data, int size):将data指向的二进制数据添加到QByteArray末尾
  4. prepend(const char * data, int size):将data指向的二进制数据添加到QByteArray开头
  5. insert(int pos, const char * data, int size):在QByteArray中的pos位置插入data指向的二进制数据
  6. remove(int pos, int len):从QByteArray中删除由pos位置开始、长度为len的一段二进制数据
  7. clear():清空QByteArray中的所有数据
  8. count():获取QByteArray中的数据字节数
  9. truncate(int pos):缩短QByteArray的大小,使其包含pos个字节
  10. resize(int size):调整QByteArray的大小
  11. toBase64():将QByteArray转换为Base64编码的字符串,用于加密或网络传输
  12. fromBase64(const QByteArray & base64):将Base64编码的字符串转换为QByteArray
  13. at(int i):返回QByteArray中第i个字节的引用,可以进行修改
  14. operator[](int i):返回QByteArray中第i个字节的值
  15. left(int len) / right(int len) / mid(int pos, int len):分别返回QByteArray中左数、右数、指定位置开始、长度为len的一段二进制数据
  16. indexOf(char c, int from = 0) / lastIndexOf(char c, int from = -1):分别返回QByteArray中字符c(字节)出现的第一个/最后一个位置的索引
  17. 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时,需要注意一些事项,以保证程序的安全和性能:

  1. 内存管理:QByteArray会自动分配和释放内存,但是过多的动态分配内存会影响程序的性能,尤其是在频繁创建和销毁QByteArray对象的情况下。因此,在使用QByteArray时应尽量避免在循环中频繁地创建或者重新赋值对象。

  2. 数据复制:QByteArray提供了许多操作方法,比如append、insert等,这些方法可能会涉及到数据复制。对于大规模的二进制数据,过多的数据复制会影响程序的性能。为了减少数据复制,可以使用reserve()预分配空间,然后通过setRawData()等方法更新数据。

  3. 编码问题:QByteArray同时支持文本和二进制数据,使用setText()和text()方法可以将二进制数据转换为文字,或将文字转换为二进制数据。在进行编码转换时,需要确保编码方式正确,并做好异常处理。

  4. 安全问题:QByteArray在存储二进制数据时禁止出现空字符,否则容易导致缓冲区溢出漏洞。此外,在进行网络通信时,要对接收到的数据进行校验,防止受到攻击。

另外,在QByteArray文档中也有详细的说明,建议在使用时先了解相关文档。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐