QByteArray 类型并没有经过编码,其存储的数据是原始的数据,并且使用了隐式共享来减少内存使用,这一特性在串口通信中,处理二进制、十六进制数据有很好的效果。由于十六进制的数据在串口通信时可以在有限的协议长度内存储更多的信息,因此在串口通信中经常可见到十六进制的出现。
在本文中针对十六进制的转化,对QByteArray在常见数值与16进制QByteArray类型间的转化、字符类型与16进制QByteArray类型间的转化、时间类型与16进制QByteArray类型间的转化,这三种常见的转换方式来进行介绍,并给出可实际使用的案例供大家参考。
一、常见数值与16进制QByteArray类型间的转化
十进制整数类型与十六进制QByteArray之间的转化
QByteArray tenToHex(int num)
{
//将10进制数组转换成16进制
return QByteArray::number(num,16) ;
}
int hexToTen(QByteArray data)
{
bool ok;
//将16进制2位数组转换成10进制
return data.setNum(data.toInt(&ok,16),10).toInt();
}
测试代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
int number = 10;
QByteArray byte;
byte = tenToHex(number);
qDebug()<<byte;
int number2 = hexToTen(byte);
qDebug()<<number2;
return a.exec();
}
实验结果
十进制浮点数类型与十六进制QByteArray之间的转化
union FloatDataTrans
{
float f;
unsigned char hex_num[4];
};
QByteArray floatToHex(float num){
FloatDataTrans data;
data.f = num;
QByteArray array;
char* str = new char[50];
char* temp = str;
for(int i = 0; i < 4; i++){
snprintf(str, sizeof(char)*4, "%02X", data.hex_num[4-i-1]);
if(i!=3)
str = str + 2;
}
array = QByteArray(temp);
delete [] temp;
temp = NULL;
str = NULL;
return array;
}
float hexToFloat(QByteArray data)
{
unsigned long num = strtoul(data,NULL,16);
return *(float*)#
}
测试代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
float number = 11.11;
QByteArray byte;
byte = floatToHex(number);
qDebug()<<byte;
float number2 = hexToFloat(byte);
qDebug()<<number2;
return a.exec();
}
实验结果
二、字符类型与16进制QByteArray类型间的转化
QString类型与十六进制QByteArray之间的转化
QByteArray stringToHex(QString str)
{
return str.toUtf8().toHex();
}
QString hexToString(QByteArray byte)
{
QByteArray byteArray;
for (int i = 0; i < byte.size(); i += 2)
{
//对16进制编码的byte,以两位为编排转化为字节编码来供fromUtf8函数使用
QString byteString = byte.mid(i, 2);
bool ok;
int byteValue = byteString.toInt(&ok, 16);
//处理无效的16进制字符
if (!ok)
{
return QString();
}
byteArray.append(byteValue);
}
QString result = QString::fromUtf8(byteArray);
return result;
}
测试代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString str ="Hello";
QByteArray byte;
byte = stringToHex(str);
qDebug()<<byte;
QString str2 = hexToString(byte);
qDebug()<<str2;
return a.exec();
}
实验结果
char类型与十六进制QByteArray之间的转化
QByteArray charToHex(char* cstr)
{
return QByteArray(cstr).toHex();
}
const char* hexToChar(QByteArray byte)
{
QByteArray byteArray;
for (int i = 0; i < byte.size(); i += 2)
{
//对16进制编码的byte,以两位为编排转化为字节编码来供fromUtf8函数使用
QString byteString = byte.mid(i, 2);
bool ok;
int byteValue = byteString.toInt(&ok, 16);
if (!ok)
{
// 处理无效的 16 进制字符
return nullptr;
}
byteArray.append(byteValue);
}
return byteArray.constData();
}
测试代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
char *cstr = "Hello";
QByteArray byte;
byte = charToHex(cstr);
qDebug()<<byte;
const char* cstr2 = hexToChar(byte);
QString str;
for(int i = 0; i < strlen(cstr2); i++){
str += cstr2[i];
}
qDebug()<<str;
return a.exec();
}
实验结果
三、时间类型与16进制QByteArray类型间的转化
QDateTime类型与十六进制QByteArray之间的转化
/*
* datetime转换为8位的16进制QByteArray
*/
QByteArray dateTimeToHex(QDateTime datetime)//dateTimeToHex函数需要使用上文中的tenToHex函数
{
QByteArray temp;
qint64 time = datetime.currentSecsSinceEpoch();//转化为时间戳
qDebug()<<time;
temp = tenToHex(time);
return temp;
}
/*
* 8位的16进制QByteArray转换为datetime
*/
QDateTime hexToDateTime(QByteArray byteArray)//hexToDateTime函数需要使用上文中的hexToTen函数
{
int createTime = hexToTen(byteArray); //转化为10进制的时间戳
return QDateTime::fromSecsSinceEpoch(createTime);
}
测试代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDateTime time = QDateTime::currentDateTime();
qDebug()<<time;
QByteArray byte = dateTimeToHex(time);
qDebug()<<byte;
QDateTime time2 = hexToDateTime(byte);
qDebug()<<time2;
return a.exec();
}
实验结果