首页 > 技术文章 > Qt 串口通信之使用16进制发送数据的转换方式

lvvou 2021-07-05 22:33 原文

一 概述

有时候在做上位机串口通讯时,经常需要将字符串转成16进制的形式作为发送,借此分析记录一下。

二 需求分析

//假设需要转换的字符:如下
QString str = "abcdef1234";
//需求转换成 0xab,0xcd,0xef,0x12,0x34

很民享

由上图分析得出,很明显我们只需要拆分字符串然后再重新合并就ok啦,知道了解决方法,接下来就是上代码。

三 编写代码

方法1:

/*********************
 * 功能:字符转成10进制
 * Example: '9' -> 9
**********************/
int CalcCharValue(char ch)
{
    int value = 0;
    if(ch >= '0' && ch <= '9'){
        value = ch - '0';

    }else if( ch >= 'A' && ch <= 'F'){
        value = ch - 'A' + 10;

    }else if( ch >= 'a' && ch <= 'f'){
        value = ch - 'a' + 10;
    }

    return value;
}

/*********************
 * 功能:转换函数
 * Example: "abcdef1234" -> 0xab,0xcd,0xef,0x12,0x34
**********************/
QByteArray QStringHexToByteArrayHex(QString str)
{
    QByteArray result;
    QByteArray array = str.toLatin1();

    /*为空不做处理*/
    if(array.isEmpty())
        return result;

    /*如果奇数时则补0*/
    if(array.count() % 2 != 0){
        array.append('0');
    }

    /*转换过程*/
    for(int i = 0; i < array.count(); i += 2){
        char a = array.at(i);
        char b = array.at(i + 1);
        result.append((CalcCharValue(a) << 4) | CalcCharValue(b));
    }

    return result;
}

调用方式:

    QByteArray hexBuf = QStringHexToByteArrayHex("abcdef1234");
    qDebug() << hexBuf;

调试结果:

"\xAB\xCD\xEF\x12""4"

方法2:

QByteArray QStringHexToByteArrayHex(QString src)
{
    return QByteArray::fromHex(src.toLatin1());
}

调用方式:

    QByteArray hexBuf = QStringHexToByteArrayHex("abcdef1234");
    qDebug() << hexBuf;

调试结果:

"\xAB\xCD\xEF\x12""4"

四 结束

以上可见第二种方法比较简单,很多时候Qt都帮封装好了很多有用的函数,不必要自己单独转换。

推荐阅读