深入浅出之QByteArray

QByteArray 是 Qt 框架中的一个类,它提供了字节数组的存储和处理功能。这个类非常有用,因为它允许你以字节为单位存储和操作数据,这在处理二进制数据、网络通信、文件读写等场景中非常常见。

以下是一些关于 QByteArray 的关键点和常用操作:

一、创建和初始化

  • 默认构造函数:创建一个空的 QByteArray
  • 从字符串创建:可以使用 QByteArray(const QString &str, const char *codec = QTextCodec::codecForName("UTF-8")) 构造函数从 QString 创建 QByteArray,指定编码(默认为 UTF-8)。
  • 从字符数组创建:可以使用 QByteArray(const char *data, int size) 构造函数从 C 风格的字符数组创建 QByteArray
  • 从另一个 QByteArray 创建:可以使用复制构造函数 QByteArray(const QByteArray &other)

二、数据访问和操作

  • 访问数据:可以使用 const char* constData() const 获取指向字节数组内部数据的指针(只读),或者使用 data() 获取可写的指针(注意,这可能会导致数据重新分配和复制)。
  • 大小:可以使用 int size() const 获取字节数组的大小。
  • 追加数据:可以使用 QByteArray &append(const char *data, int size)QByteArray &append(const QByteArray &other) 等方法追加数据。
  • 前置数据:可以使用 QByteArray &prepend(const char *data, int size)QByteArray &prepend(const QByteArray &other) 等方法在前置位置添加数据。
  • 移除数据:可以使用 QByteArray &remove(int position, int n) 移除指定位置的数据。
  • 替换数据:可以使用 QByteArray &replace(int position, int n, const char *after, int alen) 替换指定位置的数据。
  • 截断数据:可以使用 void truncate(int pos) 截断字节数组到指定位置。

三、转换

  • 转换为 QString:可以使用 QString toString(const char *codecName = nullptr) const 方法将 QByteArray 转换为 QString,指定编码(默认为 UTF-8)。
  • 转换为 char*:可以使用 data() 或 constData() 方法获取指向内部数据的指针,但需要注意数据的生命周期和可写性。
  • 转换为 std::vector<char>:可以手动复制数据到 std::vector<char> 中。

四、其他操作

  • 填充:可以使用 void fill(char ch, int size = -1) 方法用指定字符填充字节数组。
  • 清空:可以使用 void clear() 方法清空字节数组。
  • 比较:可以使用 bool operator==(const QByteArray &other) const 和 bool operator!=(const QByteArray &other) const 方法比较两个 QByteArray 是否相等或不等。

五、使用示例 

QByteArray 是 Qt 框架中用于处理字节数据的类。以下是一些 QByteArray 的使用示例,展示了如何创建、访问、修改、转换和操作字节数组。

示例一:创建和初始化 QByteArray

#include <QByteArray>  
#include <QDebug>  
  
int main() {  
    QByteArray byteArray1; // 创建一个空的 QByteArray  
    QByteArray byteArray2("Hello, World!"); // 使用字符串初始化  
    QByteArray byteArray3(10, 'a'); // 创建一个大小为10且填充字符'a'的 QByteArray  
  
    qDebug() << "byteArray1:" << byteArray1;  
    qDebug() << "byteArray2:" << byteArray2;  
    qDebug() << "byteArray3:" << byteArray3;  
  
    return 0;  
}

示例二:访问和修改 QByteArray 数据 

#include <QByteArray>  
#include <QDebug>  
  
int main() {  
    QByteArray byteArray("Hello, World!");  
  
    // 访问数据  
    char firstChar = byteArray[0];  
    qDebug() << "First character:" << firstChar;  
  
    // 修改数据  
    byteArray[0] = 'h';  
    qDebug() << "Modified byteArray:" << byteArray;  
  
    // 使用 append 方法  
    byteArray.append(" Goodbye!");  
    qDebug() << "Appended byteArray:" << byteArray;  
  
    return 0;  
}

示例三:QByteArray 与其他类型的转换

#include <QByteArray>  
#include <QDebug>  
#include <QString>  
#include <stdio.h>  
  
int main() {  
    QByteArray byteArray("Hello, World!");  
  
    // 转换为 QString  
    QString str = QString::fromUtf8(byteArray);  
    qDebug() << "QString:" << str;  
  
    // 从 QString 转换为 QByteArray  
    QByteArray byteArrayFromString = str.toUtf8();  
    qDebug() << "QByteArray from QString:" << byteArrayFromString;  
  
    // 转换为 C 风格字符串(const char*)  
    const char* cstr = byteArray.constData();  
    printf("C-style string: %s\n", cstr);  
  
    return 0;  
}

示例四:查找和分割 QByteArray 

#include <QByteArray>  
#include <QDebug>  
  
int main() {  
    QByteArray byteArray("Hello, World! Hello, Qt!");  
  
    // 查找子串  
    int index = byteArray.indexOf("Hello");  
    qDebug() << "First occurrence of 'Hello':" << index;  
  
    // 分割  
    QList<QByteArray> parts = byteArray.split(',');  
    for (const QByteArray &part : parts) {  
        qDebug() << "Part:" << part;  
    }  
  
    return 0;  
}

 示例五:QByteArray 与文件操作

#include <QFile>  
#include <QByteArray>  
#include <QDebug>  
  
int main() {  
    QFile file("example.bin");  
    if (file.open(QIODevice::ReadOnly)) {  
        QByteArray fileData = file.readAll();  
        file.close();  
        qDebug() << "File data:" << fileData;  
  
        // 对数据进行操作...  
  
        // 写回文件  
        if (file.open(QIODevice::WriteOnly)) {  
            file.write(fileData);  
            file.close();  
        }  
    } else {  
        qDebug() << "Failed to open file.";  
    }  
  
    return 0;  
}

示例六:使用 QDataStream 与 QByteArray 

#include <QByteArray>  
#include <QDataStream>  
#include <QDebug>  
  
int main() {  
    QByteArray ba;  
    QDataStream stream(&ba, QIODevice::WriteOnly);  
  
    float f = 3.14;  
    stream << f; // 将浮点数写入 QByteArray  
  
    // 将 QByteArray 分为多个部分(假设你知道数据的结构)  
    // 这里仅作为示例,实际上可能需要更复杂的解析  
    QDataStream inStream(ba);  
    float readF;  
    inStream >> readF;  
    qDebug() << "Read float from QByteArray:" << readF;  
  
    return 0;  
}

 这些示例展示了 QByteArray 的基本用法,包括创建、初始化、访问、修改、转换、查找、分割以及与文件操作和数据流的结合使用。在实际应用中,你可以根据具体需求选择合适的方法和操作。

QByteArray创建一个10000个数据,里面从1~255赋值

在 Qt 中,QByteArray 是一个用于存储字节序列的类。如果你想创建一个包含 10000 个数据的 QByteArray,并且希望这些数据的值从 1 到 255 循环赋值,你可以按照以下步骤进行操作:

  1. 创建一个空的 QByteArray
  2. 使用一个循环来填充这个数组,循环次数为 10000。
  3. 在每次循环中,计算一个从 1 到 255 循环的值,并将其转换为 char 类型(因为 QByteArray 存储的是字节,即 char 类型的数据)。
  4. 将计算出的 char 值追加到 QByteArray 中。

以下是一个示例代码:

#include <QByteArray>  
#include <QDebug>  
  
int main() {  
    QByteArray byteArray;  
    byteArray.reserve(10000); // 预留空间以提高性能(可选)  
  
    for (int i = 0; i < 10000; ++i) {  
        // 计算从1到255循环的值  
        char value = (char)((i % 255) + 1);  
        // 将值追加到QByteArray中  
        byteArray.append(value);  
    }  
  
    // 输出QByteArray的大小以验证  
    qDebug() << "QByteArray size:" << byteArray.size();  
  
    // 可选:输出部分数据以验证内容  
    for (int i = 0; i < 10; ++i) {  
        qDebug() << "byteArray[" << i << "]:" << static_cast<int>(byteArray[i]);  
    }  
  
    return 0;  
}

在这个示例中,byteArray.reserve(10000); 是可选的,但它可以预先为 QByteArray 分配足够的空间,以避免在填充过程中多次重新分配内存,从而提高性能。然后,我们使用一个 for 循环来填充数组,其中 i % 255 用于生成一个从 0 到 254 的循环索引,然后我们通过加 1 将其转换为从 1 到 255 的值。最后,我们将每个计算出的值转换为 char 类型并追加到 QByteArray 中。

注意,由于 char 类型在 C++ 中通常是有符号的,并且其值范围是从 -128 到 127(在大多数系统上),但是在这个特定的例子中,我们只关心 0 到 255 之间的无符号值。当我们将这些值转换为 char 并存储在 QByteArray 中时,它们实际上是以模 256 的方式存储的,这意味着值 255 会被存储为 -1(在二进制补码表示法中)。然而,当我们从 QByteArray 中读取这些值并将它们转换回整数时(如示例中的 static_cast<int>(byteArray[i])),我们得到的将是我们原始设置的 1 到 255 的值(在转换为 int 后)。这是因为在从 char 到 int 的转换过程中,值会被扩展(sign-extended 或 zero-extended,取决于系统和编译器的具体实现),但在这种情况下,由于我们知道原始值是无符号的,并且只关心它们在 0 到 255 范围内的表示,所以这种转换是安全的。

六、注意事项

  • QByteArray 的内部数据是动态分配的,并且会在需要时自动增长。
  • 当使用 data() 方法获取可写指针时,如果后续有对 QByteArray 的修改(如追加数据),则可能会导致之前获取的指针失效。
  • 在多线程环境中,需要确保对 QByteArray 的访问是线程安全的。

QByteArray 是 Qt 中处理字节数据的强大工具,它提供了丰富的 API 来满足各种需求。在使用时,需要注意数据的生命周期和可写性,以避免潜在的内存问题。

猜你喜欢

转载自blog.csdn.net/a8039974/article/details/143313604