首页 > 其他分享 >深入浅出之QByteArray

深入浅出之QByteArray

时间:2024-10-30 22:51:33浏览次数:9  
标签:byteArray const int 深入浅出 char QByteArray include

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 来满足各种需求。在使用时,需要注意数据的生命周期和可写性,以避免潜在的内存问题。

标签:byteArray,const,int,深入浅出,char,QByteArray,include
From: https://blog.csdn.net/a8039974/article/details/143313604

相关文章

  • 深入浅出:SpringBoot启动流程源码分析(持续更新中......)最新日期:2024年10月29日
    Hello,大家好,我是此林。今天来深入底层讲一讲SpringBoot是如何启动的,也就是我们单击运行SpringBoot启动类,它底层发生了什么?SpringBoot启动类很简单,只有一行代码。我们点进run()方法。我们发现,它底层其实进行了两步操作。第一步是new出一个SpringApplication对象,第二个是......
  • 深入浅出理解BLE AUDIO CSIS
    CSIS是CoordinateSetsIdentificationservice,翻译过来就是协调集识别服务。什么是协调集,可以理解为具有相同特征的一伙设备,最典型的就是左右两个蓝牙耳机是一个协调集,所以它们具有相同的协调集标志,但是具有相同协调集的设备要如何识别,这就是本篇需要讲解的内容,其实还是比......
  • 【深入浅出玩转FPGA】之FPGA配置模式
    FPGA配置模式XilinxUltraScaleFPGA有7种配置模式,由模式输入引脚M[2:0]决定。主串配置模式从串配置模式主并配置模式(8位或16位)从并配置模式(8位、16位或32位)主SPI配置模式主BPI配置模式JTAG/边界扫描配置模式1、主,即配置时钟CCLK由FPGA提供;从,即配置时钟CCLK由外部控制器提......
  • CSS中深入浅出系列之盒子定位:绝对定位!(脱离文档流)
    #在CSS中当一个元素被设置为绝对定位时,它会脱离正常的文档流,不再占据原本在页面布局中的空间。这意味着其他元素会忽略它的存在,就好像它不存在一样,如设计页面中的覆盖层、弹出框等时非常有用处。#一、 绝对定位的定义1、前言绝对定位可以用于脱离文档流,盒子从标准流中......
  • 深入浅出之cuda编程概念
    CUDA(ComputeUnifiedDeviceArchitecture)是NVIDIA推出的一种用于通用并行计算的编程模型和编程接口。它允许开发者利用NVIDIAGPU的强大计算能力来加速应用程序。CUDA编程涉及使用CUDAC/C++或CUDAFortran等语言编写代码,这些代码可以在GPU上并行执行,从而显著提高计算性能。......
  • 带你深入浅出设计模式:十二、桥接模式:连接抽象与实现的桥梁
    此为设计模式第十二谈!用总-分-总的结构和生活化的例子给你讲解设计模式!码农不易,各位学者学到东西请点赞收藏支持支持!开始部分:总:桥接模式的本质是将抽象部分与它的实现部分分离,使它们都能独立地变化。分:1.老规矩,自行打开VS创建一个控制台应用程序2.实现编码,这里以汽车......
  • 带你深入浅出设计模式:十一、组合实体模式:软件世界的乐高积木
    此为设计模式第十一谈!用总-分-总的结构和生活化的例子给你讲解设计模式!码农不易,各位学者学到东西请点赞收藏支持支持!开始部分:总:组合模式的目的:让客户端不再区分操作的是组合对象还是叶子对象,都以一个统一的方式来操作。分:1.老规矩,自行在vs创建一个控制台应用2.实现......
  • 深入浅出:API接口的使用方法
    在数字化时代,API接口扮演着越来越重要的角色,它使得不同软件间的数据交换和功能整合变得轻而易举。无论是提升工作效率,还是开发新的应用程序,了解如何使用API接口都是一项宝贵的技能。本文将为您详细介绍API接口的使用方法,无论您是初学者还是有经验的开发者,都能从中获益。一、......
  • 20天吃掉那只PyTorch:深入浅出的PyTorch入门教程
    eat_pytorch_in_20_days《20天吃掉那只PyTorch》是一本面向PyTorch初学者的开源教程,旨在帮助读者在20天内快速掌握PyTorch的核心概念和使用方法。本教程的主要特点包括:面向有一定机器学习和深度学习基础的读者,假定读者使用过Keras、TensorFlow或PyTorch搭建过简单模型。采用......
  • 【深入浅出MySQL】「性能调优」高性能查询优化MySQL的SQL语句编写
    总体优化大纲(1)优化查询性能:通过索引降低全表扫描频率提升数据库查询性能的途径时,一个关键的战略就是降低全表扫描的频次。因为全表扫描往往会消耗显著的计算资源,从而导致查询过程变得迟缓且效率低下,为了有效地提高查询的响应速度和整体性能。优化方向那些在where筛选条件和orderby......