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种方式:
- []
- at()
- data[]
- 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个函数是相同的)
- int size()
- int length()
- 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(); //将结构体转换为QByteArrayqDebug()<<*pMsg;qDebug()<<"QByteArray to struct";QByteArray totalByte;totalByte.append((char*)&peermsg,sizeof(peermsg));PeerMsg* pPeerMsg =(PeerMsg*)totalByte.data(); //将结构体转换为QByteArrayqDebug()<<*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;