QT QByteArray串口通信常用的类型转换函数

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*)&num;
}

测试代码

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();
}

实验结果
请添加图片描述

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值