QT字节数组类QByteArray

2023-11-04

初始化

#include "myqbytearray.h"
#include "ui_myqbytearray.h"
#include "QDebug"
#include "QtGlobal"

MyQByteArray::MyQByteArray(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray)
{
    ui->setupUi(this);
    qDebug()<<"字节数组类的初始化";
    QByteArray ba("hello");
    if('\0'==ba[5]){
        printf("ba[5]=\'\\0\'\n");
    }
    QByteArray ba2("china");
    ba2.fill('q');
    qDebug()<<ba2;
    if('\0'==ba2[5]){
        printf("ba2[5]=\'\\0\'\n");
    }
    ba2.fill('x',2);
    qDebug()<<ba2;
    if('\0'==ba[5]){
        printf("new : ba2[5]=\'\\0\'\n");
    }

}

MyQByteArray::~MyQByteArray()
{
    delete ui;
}

在这里插入图片描述
字节数组类以 ‘\0’结尾,索引的下标从0开始。
第一次调用fill函数,不指定size参数,按照之前的长度,跟新值
第二次调用fill函数,指定size参数,重新调整字节数组的长度,并更新值
在这里插入图片描述

访问某个元素

访问QByteArray类对象的某个元素有4种方式:

  1. []
  2. at()
  3. data[]
  4. constData[]

其中,[]和data[]可读可写,at()和constData[]只读、

MyQByteArray2::MyQByteArray2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray2)
{
    ui->setupUi(this);
    QByteArray ba1("hello");
    ba1.resize(10);
    ba1[0] = 'a';
    ba1[1] = 'b';
    ba1[2] = 'c';
    ba1[3] = 'd';
    ba1[4] = 'e';
    ba1[5] = 'f';
    ba1[6] = 'g';
    ba1[7] = 'h';
    ba1[8] = 'i';
    //ba1[9] = 'j';
    qDebug()<<ba1;
    if('\0'==ba1[10]){
        printf("ba1[10] = \'\\0\'\n");
    }
    ba1[1]='a';
    ba1.data()[2] ='a';
    qDebug()<<ba1;
    qDebug()<<ba1.at(1);
    qDebug()<<ba1.constData()[2];
    qDebug()<<ba1.constData()[3];


}

在这里插入图片描述
在这里插入图片描述

截取字符串

使用函数 left() right() mid()来提取多个字节。

MyQByteArray3::MyQByteArray3(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray3)
{
    ui->setupUi(this);
    QByteArray x("pineapple");
    QByteArray y1 = x.left(4);
    qDebug()<<y1;
    QByteArray y2 = x.right(5);
    qDebug()<<y2;
    QByteArray y3 = x.mid(2,4);
    qDebug()<<y3;
    QByteArray y4 = x.mid(2);
    qDebug()<<y4;

}

在这里插入图片描述
在这里插入图片描述

获取字节数组的大小

成员函数size(),length(),count()来获得字节数组的大小(除了名字不同,这3个函数是相同的)

  1. int size()
  2. int length()
  3. int count()

size()不包括字符串末尾添加的 ‘\0’
如果以字符串形式初始化,中间有‘\0’,则不统计后面的字符。
如果改变中间的字符,为‘\0’,并不会被size()截断

MyQByteArray4::MyQByteArray4(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray4)
{
    ui->setupUi(this);
    QByteArray b4("hello");
    int n1 = b4.size();
    int n2 = b4.size();
    int n3 = b4.size();
    qDebug()<<n1<<"  "<<n2<<"  "<<n3<<"  ";
    b4.data()[3]='\n';
    qDebug()<<b4.size();
    QByteArray b41("he\0llo");
    qDebug()<<b41.size();
}

在这里插入图片描述
在这里插入图片描述

数据转换与处理

Hex转换

QByteArray::fromHex() 将16进制编码的数据转换为字符类型的数据。
.toHex() 将字节数组中,字符转换为十六进制的数值编码。

MyQByteArray5::MyQByteArray5(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray5)
{
    ui->setupUi(this);
    QByteArray text1 = QByteArray::fromHex("517420697320677265617421");
    qDebug()<<text1.data();
    QByteArray text2 = text1.toHex();
    qDebug()<<text2.data();
}

在这里插入图片描述
在这里插入图片描述

数值转换与输出

QByteArray类的公有静态函数number完成十进制到其他进制的转换。
调用静态成员函数

    int n = 63;
    qDebug()<<QByteArray::number(n);
    qDebug()<<QByteArray::number(n,16);
    qDebug()<<QByteArray::number(n,2);
    qDebug()<<QByteArray::number(n,8);

在这里插入图片描述
QByteArray类的的公有函数setNum()

    qDebug()<<ba;
    ba.setNum(n,16);
    qDebug()<<ba;
    ba.setNum(n,8);
    qDebug()<<ba;
    ba.setNum(n,2);
    qDebug()<<ba;

在这里插入图片描述
QByteArray::number 将小数按指定格式的小数位转换输出。

    QByteArray ba1 = QByteArray::number(12345.6,'E',3);
    QByteArray ba2 = QByteArray::number(12345.6,'e',3);
    QByteArray ba3 = QByteArray::number(12345.6,'f',3);
    QByteArray ba4 = QByteArray::number(12345.6,'g',3);
    QByteArray ba5 = QByteArray::number(12345.6,'G',3);
    qDebug()<<ba1;
    qDebug()<<ba2;
    qDebug()<<ba3;
    qDebug()<<ba4;
    qDebug()<<ba5;

在这里插入图片描述

字母大小写转换

函数toUpper和toLower完成字母大小写转换。

    QByteArray x("hello QT ");
    qDebug()<<x.toLower();
    qDebug()<<x.toUpper();

在这里插入图片描述

在这里插入图片描述

字符串数值转化为各类数值

字符数值转化为各类型数值:to函数。

    QByteArray strint("1234");
    bool ok0;
    qDebug()<<strint.toInt();
    qDebug()<<strint.toInt(&ok0,16);qDebug()<<ok0;
    qDebug()<<strint.toInt(&ok0,8);qDebug()<<ok0;
    qDebug()<<strint.toInt(&ok0,2);qDebug()<<ok0;  //由于字符串中存在2,3,4等大于2的值,所以不能转化为二进制
    qDebug()<<"---------";
    QByteArray strint2("1234.56");
    qDebug()<<strint2.toInt();
    qDebug()<<strint2.toFloat();
    qDebug()<<strint2.toDouble();
    qDebug()<<"---------";
    QByteArray str("FF");
    bool ok2;
    qDebug()<<str.toInt(&ok2,16);
    qDebug()<<str.toInt(&ok2,10);  //字符串中存在F,超过了10和8进制的表示范围。
    qDebug()<<str.toInt(&ok2,8);

在这里插入图片描述

QBQyteArray和char*互转

使用.data()成员函数返回指向字节数组中存储数据的指针。
返回一个指向字节数组的指针,指向第一个字符。

MyQByteArray8::MyQByteArray8(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray8)
{
    ui->setupUi(this);
    QByteArray ba("hello world");
    char* data = ba.data();
    while(*data){
        cout<<" "<<*data;
        data++;
    }
    cout<<endl;
    free(data);
}

在这里插入图片描述

在这里插入图片描述

QByteArray 和std::string互转

QByteArray的类成员函数:toStdString()
QByteArrayd的静态成员函数:fromStdString()

MyQByteArray9::MyQByteArray9(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray9)
{
    ui->setupUi(this);
    QByteArray b1("hello");
    string s2 = b1.toStdString();
    QByteArray b2 = QByteArray::fromStdString(s2);
}

在这里插入图片描述

与字符串QString互转

MyQByteArray10::MyQByteArray10(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray10)
{
    ui->setupUi(this);
    QByteArray arr("hello world! ");
    QString str = arr;
    qDebug()<<str;
    qDebug()<<"------------";
    QString str2 ("hello");
    QByteArray ba = str2.toLatin1();
    qDebug()<<ba;
}

在这里插入图片描述

QByteArray和自定义结构体之间的转化

定义结构体不能再类中。。。。

根据char*数据和结构体之间的映射,实现结构体和QByteArray之间的转化。

array.append((char*)&msg,sizeof(msg));
typedef struct Header{
    int channel;
    int type;
}Header;


typedef struct Msg{
    Header header;
    char content[128];
    //友元函数 operator<<
    friend QDebug operator << (QDebug os, Msg msg){
        os << "(" << " channel:" << msg.header.channel << " type:" << msg.header.type
           << " content:" << msg.content << " )";

        return os;
    }
}Msg;

typedef struct PeerMsg
{
    PeerMsg(const int &ip,const int &por) {
        ipv4 = ip;
        port = por;
    }
    int ipv4;
    int port;
    //友元函数 operator<<
    friend QDebug operator << (QDebug os, PeerMsg msg){
        os << "(" << " ipv4:" << QString::number(msg.ipv4) << " port:" << QString::number(msg.port)
           << " )";

        return os;
    }
}PeerMsg;

void func(){
    Msg msg;
    msg.header.channel =1000;
    msg.header.type=2;
    strcpy(msg.content,"hello");
    qDebug()<<msg;

    PeerMsg peermsg(1921681001,10086);
    qDebug()<<peermsg;

    qDebug()<<"struct to QByteArray";
    QByteArray array;
    array.append((char*)&msg,sizeof(msg));
    Msg* pMsg =(Msg*)array.data();                    //将结构体转换为QByteArray
    qDebug()<<*pMsg;

    qDebug()<<"QByteArray to struct";
    QByteArray totalByte;
    totalByte.append((char*)&peermsg,sizeof(peermsg));
    PeerMsg* pPeerMsg =(PeerMsg*)totalByte.data();    //将结构体转换为QByteArray
    qDebug()<<*pPeerMsg;
    

}

在这里插入图片描述

在这里插入图片描述

判断是否为空

.isEmpty()

MyQByteArray11::MyQByteArray11(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyQByteArray11)
{
    ui->setupUi(this);
    qDebug()<<QByteArray("").isEmpty();
    qDebug()<<QByteArray("ss").isEmpty();

}

在这里插入图片描述

在这里插入图片描述

向前搜索向后搜索

.indexof() 从前向后
.lastIndexOf 从后向前

    QByteArray x("sticky question");
    QByteArray y("sti");
    qDebug()<<x.indexOf(y);
    qDebug()<<x.indexOf(y,6);
    qDebug()<<x.indexOf(y,10);
    qDebug()<<x.indexOf(y,11);

在这里插入图片描述

    qDebug()<<x.lastIndexOf(y);
    qDebug()<<x.lastIndexOf(y,8);

在这里插入图片描述

插入

    QByteArray ba("Meal");
    ba.insert(2,"hello");
    qDebug()<<ba;

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT字节数组类QByteArray 的相关文章

  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 如何使用样式表删除 QWizard 中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我已经发布了一个最小的例子here https stackoverflow com q 52538669 8570451 这个问题是由scopchanov从最小的例子中解决的 但是
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • Qt - 等待 Qprocess 完成

    我正在使用 CMDQProcess但我有一个问题 My code QProcess process process start cmd exe process write del f b txt n r process waitForFin
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 在哪里可以找到 QT 5.3.0 命令提示符

    用于学习Qt的书 C gui programming with qt 4 2nd 版 我需要Qt的命令提示符 我已经安装了Qt 5 3 0 creator 5 3 0开源 但不知道它的命令提示符在哪里 有人可以帮助我吗 我认为您正在寻找的是
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • 如何使用 Qt DOM 通过此语法获取 xml 属性

    我正在使用 Qt DOM XML 解析器 并且遇到了如下属性定义的问题
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time

随机推荐

  • PCA算法

    https www cnblogs com dengdan890730 p 5495078 html PCA算法是怎么跟协方差矩阵 特征值 特征向量勾搭起来的 PCA Principle Component Analysis 主成份分析 是
  • 2023年7月31日-8月6日,(上午熟悉公司代码,周一到周五晚上优先工作所急视频教程,其他业余时间进行ue视频教程,为独立游戏做准备,本周10小时,合计2199小时,剩余7801小时)

    按照规划 上午熟悉公司源码 下午进行filament和ue渲染 晚上写工作代码 回家后泛读pbrt或者其他书籍催眠 业余学习ue的各种视频教程 为独立游戏做准备 累了就学其他视频教程 随意 可以按照ue 渲染 gt ue osg gt ue
  • testdbg-测试调试器

    http baidutech blog 51cto com 4114344 743464 testdbg 测试调试器 2011 02 24 14 07 00 标签 测试 休闲 调试器 职场 testdbg 原创作品 允许转载 转载时请务必以
  • C#基础与Java的对比

    一 C 简介 C 是微软公司发布的一种面向对象的 运行于 NET Framework之上的高级程序设计语言 C 看起来与Java有着惊人的相似 它包括了诸如单一继承 接口 与Java几乎同样的语法和编译成中间代码再运行的过程 但是C 与Ja
  • REGEXP基础语法

    个人使用https regex101 com 这个比较多一些 大家可以使用 基础用法 限定符 Quantlfier a a出现0次或者多次 a a出现1次或者多次 a a出现0次或者1次 a 6 a出现6次 a 2 6 a出现2 6次 a
  • Labview设计计算机--组合逻辑与时序逻辑(5)

    在写接下来的内容之前 我要强烈推荐一部书 编码 隐匿在计算机软硬件背后的语言 这是一本由浅入深的书 我也是借鉴了书中的很多想法才有勇气尝试在Labview上构建一个简单的计算机 看这本书的门槛不高 大概有高中知识就差不多了 ok 进入正题
  • angular下载文件

    1 window open 打开新页面下载文件 window open url self 优点 最简洁 缺点 当参数错误时 或其它原因导致接口请求失败 这时页面会停留在新打开的页面中 无法监听到接口返回的错误信息 只在页面中直接输出错误 尽
  • 查看linux安装了哪些编译器,如何查看linux已安装的编译器及其版本

    在Linux环境下 新建一个终端 之后在终端直接输入命令 arm linux gcc v 回车之后 即可出现如下的一些信息 此处安装的是交叉编译器gcc 版本4 2 2 Using built in specs Target arm unk
  • 超详细,AI绘画里你不得不知道的SD算法详解

    前言 哈喽 各位小伙伴们大家好 说到AI绘画 可谓是近几年来异军突起 犹如洪水猛兽一般 各种的本土化 商业化 但是相信也有很多朋友跟我一样 对AI绘画的原理一知半解 甚至根本不知道它是怎么工作的 这样只靠着在网上复制粘贴别人的prompt
  • java自学笔记6:UML简介+阶段练习

    1 UML概念 Unified Modeling language UML 又称统一建模语音或标准建模语言 是一个支持模型化和软件系统开发的图形化语言 为软件开发的所有阶段提供模型化和可视化支持 2 UML图示 UML2 2中一共定义了14
  • 使vue组件居中、中下

    position absolute left 50 top 50 transform translate 50 50 中下 居中往下 login form position absolute 绝对定位 bottom 0px 最底下 widt
  • 相机成像 - ISP之RGB域处理

    在之前的文章中 介绍了ISP 的基本流程和RAW域中的处理方法 完美成像中最重要的环节 ISP之RGB域处理 今天延续之前的内容 讲解中间的部分 RGB域的处理 ISP的流程具体如图所示 我们继续围绕这个图把RGB域中每个部分的处理给大家讲
  • 【最远点采样FPS】点云采样方式(一) — 最远点采样

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 点云最远点采样FPS
  • CC2640R2F低功耗蓝牙芯片相关设计分享

    电路设计简介 CC2640 的 RF 差分线越短越好 做差分 100 阻抗匹配 天线部分阻抗 50 欧姆匹配 本次设计采用了陶瓷天线 AN9520 245 减少天线面积 蓝牙芯片在底层 阻抗参考平面第三层 在天线部分下方覆铜 GND 使用嘉
  • nginx配置部署一个域名,多个端口

    最近用基于windows下的nginx部署了服务器 1 安装好windows下的nginx以后 会有以下文件 找到conf下的nginx 此文件为nginx的配置文件 2 初始只有一个默认80端口 这是nginx的默认端口号 server
  • 高并发的epoll+线程池,业务在线程池内

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • Web服务器

    文章目录 1 HTTP 协议 1 1 概述 1 2 URI和URL的区别 1 3 请求消息 Request 1 4 响应消息 Response 1 5 状态码 1 6 HTTP 1 0 和 HTTP 1 1 1 7 Cookie 1 8 S
  • Spring是如何支持多数据源的

    大家好 我是课代表 欢迎关注我公众号 Java课代表 上篇介绍了数据源基础 并实现了基于两套DataSource 两套mybatis配置的多数据源 从基础知识层面阐述了多数据源的实现思路 不了解的同学请戳 同学 你的多数据源事务失效了 正如
  • 9.5位操作(二)——给定一个介于0和1之间的实数,类型为double,打印它的二进制表示

    功能 给定一个介于0和1之间的实数 类型为double 打印它的二进制表示 如果该数字无法精准地用32位以内的二进制表示 则打印 ERROR 两种方法 方法一 将数字乘以2以后 与1比较 public static String print
  • QT字节数组类QByteArray

    QT字节数组类QByteArray 初始化 访问某个元素 截取字符串 获取字节数组的大小 数据转换与处理 Hex转换 数值转换与输出 字母大小写转换 字符串数值转化为各类数值 QBQyteArray和char 互转 QByteArray 和