数据处理与转换

Hex 转换(十六进制转换)

QByteArray 类的共有静态函数 QByteArray::fromHex 可以把十六进制编码的数据转换为字符(char)类型的数据,并存储到QByteArray类对象中。该函数声明如下:

   QByteArray fromHex(const QByteArray &hexEncoded);

其中,参数hexEncoded 是十六进制编码的字节数组。

例:

QByteArray text=QByteArray::fromHex("51742069732677265617421");
text.data(); //return "Qt is great!"

QByteArray类的共有静态函数number 可以将某个整数转换为某种进制的字符素组,函数number原型声明如下:

QByteArray number(int n,int base=10)

其中,参数n是要转变的整数;base是要进行转换的进制,进制取值范围2到36,即从二进制到三十六进制。

int n=63;
QByteArray::number(n);  //"63"
QByteArray::number(n,16) //3f
QByteArray::number(n,16).toUpper() //3F
QByteArray::number(n,2) //111111
QByteArray::number(n,8) //77

与此共有静态函数功能类似的共有函数是setNum(),该函数也是将某个证书转为某种进制的字符数组,函数原型声明如下:

QByteArray &setNum(int n,int base=10)

其中,参数n是要转变的整数;base是要进行转换的进制,进制取至范围为2到36 下列代码演示了setNum()函数的使用:

QByteArray ba;
int n=63;
ba.setNum(n); //ba=="63"
ba.setNum(n,16); //ba=3f

因为不是静态函数,所以要用对象来调用。此外,根据setNum()函数第一个参数的类型,setNum()函数可以由多个版本
QByteArray类对象若为带大小写字母的字符串,可调用函数toUpper()和toLower()实现字母大小写转换。
转换之前可以通过isUpper()和isLower()进行判断
QByteArray 类对象的字符若都为数值,则可通过toXXX函数转换为各种数据类型的数据,实例如下:

 QByteArray strInt("1234");
 bool ok;
 qDebug()<<strInt.ToInt(); //1234 注意:默认是把strInt的内容作为十六进制的数1234,因而对应的十进制数为4660
 qDebug()<<st.toInt(&ok2,16); //转换为十六进制

QString 是Qt的字符串类,QByteArray 是byte的数组,它们之间也可以互转。二者本质上是类似的,区别在于QByteArray存储的是无法显示的字符,QString 存储的是可以显示的字符。

QString str=QString("hello world!");
QByteArray arr=str.toLatin1();
//QByteArray 转QString 
QByteArray arr("hello world!")
QString str=arr;
QByteArray ba("abc123");
QString str=ba;
//QString  转为QByteArray
QString str("abc123");
QByteArray ba=str.toLatin1();


在Socket 网络编程中,网络数据一般是uchar 类型。在Qt中则可以使用QByteArray 类 。QByteArray类在QSocket 共享库中,根据c++中 char* 数据与结构体之间的映射可以实现结构体与QByteArray 的转换.

判断是否为空

可以使用函数 isEmpty() 来判断字节数组是否为空,即size 是否为0。函数isEmpty() 的原型声明如下

bool isEmpty();

如果字节数组的size 为0,则返回true,否则返回false
下列代码演示isEmpyte()函数的使用

QByteArray().isEmpty(); //returns true
QByteArray("").isEmpty();// returns true
QByteArray("abc").isEmpty(); // returns false

函数indexOf() 返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索,函数的原型声明如下:

int indexOf(const QByteArray &ba,int from =0);

其中,参数ba为要茶轴的目标字节数组ba,找到就返回索引值;from 表示开始搜索位置对应的索引值,默认从索引值为0的位置开始搜索。如果找到ba,则返回第一次出现ba所在位置对应的索引值,如果没有找到则返回-1.注意,所谓向前搜索就是朝着索引值增大的方向搜索,即在数组中从左到右搜索。另外还有一个函数,lastIndexOf()是向后搜索的,声明如下:

int lastIndexOf(const QByteArray &ba,int from =-1);

插入

函数insert()可以在某个索引位置上插入字节数组,该函数的原型声明如下:

QByteArray &insert(int i,const QByteArray &ba);

其中,i为要插入的索引位置;ba为要插入进去的字节数组对象

QByteArray ba("Meal")
ba.insert(1,QByteArray("ontr"))
//ba=Montreal

此外,也可以在某个位置插入一个或多个字符,由两个函数,声明如下:

QByteArray & QByteArray::insert(int i,char ch);
QByteArray & insert(int i,int count,char ch);

其中 ,i为要插入的索引位置;count 是要插入的字符个数,其实就是count 个ch;ch为要插入的字符。
含有另外一种重载形式,就是插入char* 类型的数据

QByteArray & insert(int i,const char* str);
QByteArray & QByteArray::insert(int i,const char*str,int len);

第一中形式不带长度,插入全部str;第二种形式带长度len,len表示str中的len个字节
QChar 类提供了很多成员函数:

函数 说明
bool isDigit() const; 判断是否是十进制数字('0'-'9')
bool isLetter() const; 判断是否是字母
bool isNumber() const; 判断是否是数字,包括正负号、小数点等
bool isLetterOrNumber(); 判断是否是字母或数字
bool isLower() const; 判断是否是小写字母
bool isUpper() const; 判断是否是大写字母
bool isNull() const; 判断是否是空字符
bool isPrint() const; 判断是否可打印字符
bool isSpace() const; 判断是否是分隔符,包括空格
char toAssii() const; 得到字符的Asscii码
QChar toLower() const; 转换成小写字母
QChar toUpper() const; 转换成大写字母
ushort unicode() const; 得到Unicode编码

Qt 中定义了一些与QChar 类相关的比较运算符

bool operator!=(QChar c1,QChar c2);  //判断c1是否不等于c2
bool operator<(QChar c1,QChar c2); //判断c1是否小于c2
.... <= ....
....== ....
....>....
....>=....

QChar 转换为char 可利用下列2个成员函数:

char toLatin1();
char toAscii();
posted @ 2026-02-13 14:02  丹心石  阅读(25)  评论(0)    收藏  举报