QT字节数组类QByteArray

news2024/11/23 21:16:41

QT字节数组类QByteArray

  • 初始化
  • 访问某个元素
  • 截取字符串
  • 获取字节数组的大小
  • 数据转换与处理
    • Hex转换
    • 数值转换与输出
  • 字母大小写转换
  • 字符串数值转化为各类数值
  • QBQyteArray和char*互转
  • QByteArray 和std::string互转
  • 与字符串QString互转
  • QByteArray和自定义结构体之间的转化
  • 判断是否为空
  • 向前搜索向后搜索
  • 插入

初始化

#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;

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【人工智能】对研究方法,智能模拟,学科范畴,涉及学科,研究范畴,安全问题,实现方法,人工智能与人类差距等方面的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Qt Core学习日记——第五天QMetaProperty

QMetaProperty代表类的属性 用Q_PROPERTY在类中声明属性 在moc会有具体变量名称字符串 函数分析&#xff1a; QMetaProperty::isEnumType 判断这个属性是否是枚举。 QMetaProperty::enumerator 获取属性对应的枚举信息&#xff0c;如果不是枚举返回未定义的QMetaEnum QMetaPr…

关于 Qt在windows使用mingw32编译器时从Qt5.9切换至Qt5.12出现“C2001:常量中有换行符“不修改编码 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131901444 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

[Angular] Import TranslateModule in Angular 16

1.Background Angular 更新至V16版后&#xff0c;支援 standalone&#xff0c;故移除了 NgModule&#xff0c;而TranslateModule 又要在AppModule中 import&#xff0c;那该如何做呢&#xff1f; 2.NPM packages installation npm install ngx-translate/core npm install n…

ElasticSearch Java API 操作

1.idea创建Maven项目 2.添加依赖 修改 pom.xml 文件 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 的客户端 --…

大型企业采购云管平台的需求是什么?选择哪家厂商好?

很多大型企业已经上云&#xff0c;但一直找不到合适的云管平台。今天我们就来一起简单聊聊大型企业采购云管平台的需求是什么&#xff1f;选择哪家厂商好&#xff1f; 大型企业采购云管平台的需求是什么&#xff1f; 对于大型企业而言&#xff0c;多云管理的主要痛点是海量异…

【C++】深入浅出STL之string类

文章篇幅较长&#xff0c;越7万余字&#xff0c;建议电脑端访问 文章目录 一、前言1、C语言中的字符串2、string类的使用场景 二、初步认识string类1、概述2、常用接口细述1&#xff09;string类对象的默认成员函数2&#xff09;string类对象的常见容量操作① size、length、ca…

linux系统的JDK11安装详细教程

下载jdk jdk-15.0.2.exe等4个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 安装插件 yum -y install lrzsz 1、上传linux 系统的jdk 切换linux系统需要安装路径 cd /usr/local/ rz 直接回车会弹出本地电脑上传路径 2.命令&#xff1a;tar -zxvf 需要解压的…

[Linux]环境变量 进程地址空间(虚拟内存与物理内存的关系)

hello,大家好&#xff0c;这里是bang_bang&#xff0c;今天我们来讲一下语言层级上的程序地址空间和系统层级上的进程地址空间的区别&#xff0c;在下面中我举的例子会设计到环境变量&#xff0c;所以开篇我先讲讲环境变量。 目录 1️⃣环境变量 &#x1f359; 基本概念 &am…

android studio JNI开发

一、JNI的作用&#xff1a; 1.使Java与本地其他类型语言&#xff08;C、C&#xff09;交互&#xff1b; 2.在Java代码调用C、C等语言的代码 或者 C、C调用Java代码。 由于JAVA具有跨平台的特点&#xff0c;所以JAVA与本地代码的交互能力弱&#xff0c;采用JNI特性可以增强JA…

手写Nacos基本原理——服务注册 配置管理

手写Nacos基本原理 一、背景介绍二、 思路方案三、过程nacosService代码pom文件配置文件具体类 nacosSDK代码pom文件配置类具体类 serviceA代码pom文件配置文件具体类 serviceB代码pom文件配置文件具体类 实现效果四、总结五、升华 一、背景介绍 之前在项目开发的过程中&#…

Java 贪心算法经典问题解决

文章目录 分金条题目思路代码实现测试用例以及结果输出 花费资金做项目最大收益题目思路代码实现测试用例以及结果输出 预定会议室题目思路代码实现测试用例以及结果输出 取中位数题目思路代码实现测试用例以及结果输出 最低字典序题目思路代码实现测试用例以及结果输出 结语 分…

如何在工作中利用Prompt高效使用ChatGPT

导读 AI 不是来替代你的&#xff0c;是来帮助你更好工作。用better prompt使用chatgpt&#xff0c;替换搜索引擎&#xff0c;让你了解如何在工作中利用Prompt高效使用ChatGPT。 01背景 现在 GPT 已经开启了人工智能狂潮&#xff0c;不过是IT圈&#xff0c;还是金融圈。 一开…

【线性规划、非线性规划、多目标规划】

有限的条件下&#xff0c;最大的收益 线性规划就是在一组线性约束条件下&#xff0c;求线性目标函数的最大或者最小值 线性就是指所有的变量都是一次方 整数规划、0-1规划都是默认为线性规划的特例 MATLAB自带的函数求解线性规划问题&#xff1a; Linprog函数 模型化为MATL…

docker+Jenkins

拉取镜像 docker pull jenkins/jenkins启动容器 8080端口映射58080 jenkins_home 映射本地/data/下方便查看 docker run -d -p 58080:8080 -p 5000:50000 -v /data/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins访问ip:5…

线性神经网路——线性回归随笔【深度学习】【PyTorch】【d2l】

文章目录 3.1、线性回归3.1.1、PyTorch 从零实现线性回归3.1.2、简单实现线性回归 3.1、线性回归 线性回归是显式解&#xff0c;深度学习中绝大多数遇到的都是隐式解。 3.1.1、PyTorch 从零实现线性回归 %matplotlib inline import random import torch #d2l库中的torch模块&a…

前端密码加密 —— bcrypt、MD5、SHA-256、盐

&#x1f414; 前期回顾悄悄告诉你&#xff1a;前端如何获取本机IP&#xff0c;轻松一步开启网络探秘之旅_彩色之外的博客-CSDN博客前端获取 本机 IP 教程https://blog.csdn.net/m0_57904695/article/details/131855907?spm1001.2014.3001.5501 在前端密码加密方案中&#xff…

开发一个RISC-V上的操作系统(三)—— 串口驱动程序(UART)

目录 文章传送门 一、什么是串口 二、本项目串口的FPGA实现 三、串口驱动程序的编写 四、上板测试 文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&…

Linux-定时清除日志No space left on device

由于开发环境上一般机器资源较少&#xff0c;很容易导致因日志文件过大而导致系统宕机&#xff0c;报错No space left on device等问题&#xff0c;我们可以通过添加定时任务&#xff0c;自动删除日志从而达到节省空间的目的 操作步骤&#xff1a; 云服务器进入救援模式(若服…

目前主流的几个Web前端框架

启动项目时&#xff0c;请查看 2023 年最好的 Web 前端框架。为什么选择合适的工具很重要? 前端开发人员使用前端框架来简化工作。这些软件包通常提供可重用的代码模块、系统化的前端技术和预构建的接口块。这使团队可以更快、更轻松地创建可持续的 Web 应用程序和用户界面&am…