QT十进制十六进制字符串转换

QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述。本文通过以下几个部分加以介绍:

1. 初始化

2. 访问与赋值

3. 添加、删除、插入与替换操作

4. 查找与比较

5. 数据转换与处理

1 初始化

2 访问与赋值

    访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:

  1.  

    QByteArray ba;
    
    ba.resize(6);
    
    ba[0] = 0x3c;
    
    ba[1] = 0xb8;
    
    ba[2] = 0x64;
    
    ba[3] = 0x18;
    
    ba[4] = 0xca;
    
    ba.data()[5] = 0x31;
    
    qDebug()<<"[]"<<ba[2]; //[] d
    
    qDebug()<<"at()"<<ba.at(2); //at() d
    
    qDebug()<<"data()"<<ba.data()[2]; //data() d
    
    qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
    
    qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1

     

3 添加、删除、插入与替换操作

4 查找与比较

5 数据转换与处理

    从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

    1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

    2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

    3)转为整型、浮点型等数值类型;

    4)大小写转换;

    5)转为字符串类型;

5.1 Hex转换

    把Hex编码转换为char存储到QByteArray:

 

 

QByteArray text = QByteArray::fromHex("517420697320677265617421");

text.data(); // returns "Qt is great!"

 

    把QByteArray转为Hex编码:

 

QByteArray ba;

ba.resize(3);

ba[0] = 0x30;

ba[1] = 0x31;

ba[2] = 0x32;

qDebug() << ba.toHex(); //return "303132"

 

5.2 数值转换与输出

    尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

    把单个字符转为2-36进制数据格式:

 

int n = 63;

qDebug()<<QByteArray::number(n); // returns "63"

qDebug()<<QByteArray::number(n, 16); // returns "3f"

qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F"

qDebug()<<QByteArray::number(n, 2); // returns "111111"

qDebug()<<QByteArray::number(n, 8); // returns "77"

 

    按照指定进制格式直接复制,其中n可以是各类常见数值类型:

 

QByteArray ba;

int n = 63;

ba.setNum(n); // ba == "63"

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

 

    把数值按指定格式和小数位转换输出,小数位四舍五入:

 

QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);

QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);

qDebug()<<ba1; // returns "1.235E+01"

qDebug()<<ba2; // returns "12.346"

 

5.3 字符串数值转为各类数值

    QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

QByteArray strInt("1234");

bool ok0;

qDebug() << strInt.toInt(); // return 1234

qDebug() << strInt.toInt(&ok0,16); // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660

QByteArray string("1234.56");

bool ok1;

qDebug() << string.toInt(); // return 0, 小数均视为0

qDebug() << string.toInt(&ok1,16); // return 0, 小数均视为0

qDebug() << string.toFloat(); // return 1234.56

qDebug() << string.toDouble(); // return 1234.56

QByteArray str("FF");

bool ok2;

qDebug() << str.toInt(&ok2, 16); // return 255, ok2 == true

qDebug() << str.toInt(&ok2, 10); // return 0, ok == false, 转为十进制失败

5.4 大小写转换

    QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:

QByteArray x("Qt by THE QT COMPANY");

QByteArray y = x.toLower();

// y == "qt by the qt company"

QByteArray z = x.toUpper();

// z == "QT BY THE QT COMPANY"

5.5 与字符串互转

    QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符

    QByteArray转为QString示例:

QByteArray ba("abc123");

QString str = ba;

//或str.prepend(ba);

qDebug()<<str ;

//输出:"abc123"

    QString转为QByteArray示例:

QString str("abc123");

QByteArray ba = str.toLatin1();

qDebug()<<ba;

//输出:"abc123"

--------------------- 本文来自 电子技术课程 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/ecourse/article/details/80575691?utm_source=copy

QByteArray和十六进制的QString(char*)相互转换

 #include <QCoreApplication>
 #include <QDebug>
 #include <QDataStream>
 
QByteArray HexStringToByteArray(QString HexString)
 {
     bool ok;
     QByteArray ret;
     HexString = HexString.trimmed();
     HexString = HexString.simplified();
     QStringList sl = HexString.split(" ");
 
     foreach (QString s, sl) {
         if(!s.isEmpty()) {
             char c = s.toInt(&ok,16)&0xFF;
             if(ok){
                 ret.append(c);
             }else{
                 qDebug()<<"非法的16进制字符:"<<s;
             }
         }
     }
     return ret;
 }
 
 QString ByteArrayToHexString(QByteArray &ba)
 {
     QDataStream out(&ba,QIODevice::ReadWrite);   //将str的数据 读到out里面去
     QString buf;
     while(!out.atEnd())
     {
         qint8 outChar = 0;
         out >> outChar;   //每次一个字节的填充到 outchar
         QString str =QString("%1").arg(outChar&0xFF,2,16,QLatin1Char(‘0‘)).toUpper() + QString(" ");   //2 字符宽度
         buf += str;
     }
     return buf;
 }

 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
     char cmd[7] = {0x40, 0x00, 0x00, 0x01, 0x00, 0x41, 0x0A};
     char* cmdString = "40 00 00 01 00 41 0a";
     QByteArray cmdBA = HexStringToByteArray(cmdString);
     qDebug()<<ByteArrayToHexString(cmdBA);
 
     return a.exec();
 }

1、QString的arg()方法用于填充字符串中的%1,%2...为给定的参数,如

QString m = tr("%1:%2:%3").arg("12").arg("60").arg("60");    // m = "12:60:60:

2、它还有另外一种重载方法:

QString QString::​arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const

这个方法用于填充字符串中的%1,%2...为给定格式的整形数字,其中第一个参数是要填充的数字,第二个参数为最小宽度,第三个参数为进制,第四个参数为当原始数字长度不足最小宽度时用于填充的字符。

如:

// text = "00123:00456"
QString text = QString("%1:%2").arg(123, 5, 10, QChar('0')).arg(456, 5, 10, QChar('0')); 

--------------------- 本文来自 Fighting_YoungMan 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Fighting_YoungMan/article/details/70611052?utm_source=copy

Qt十六进制转十进制转ascii码,最近用的比较多,所以将它写成了内联函数
看代码:

//返回16进制数的ascii码值
inline int ServeWidget::changefromHex_to_ascii(QString str)
{
    QString str_hex = str;                  //获取十六进制数
    int dec = str_hex.toInt(0,16);          //十六进制转十进制
    char st = dec;                          //十进制数用char类型表示--->必须有此步直接转化不可行
    QString str_ascii = QString(st);        //转化为ASCII值
    int str_int = str_ascii.toInt();        //转化为int值
    return str_int;                         //返回十六进制符号的ascii码值
}

--------------------- 本文来自 52_赫兹的鲸 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_40194498/article/details/79643509?utm_source=copy

  • 23
    点赞
  • 180
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要将Qt中的十六进制字符串转换为其他进制,可以使用QtQString类的toUInt()函数。该函数可以将字符串转换为无符号整数,并且可以指定进制。例如,如果要将十六进制字符串转换十进制,可以使用以下代码: QString hexString = "A1B"; // 十六进制字符串 bool ok; int decimalValue = hexString.toUInt(&ok, 16); // 将十六进制字符串转换十进制 QString decimalString = QString::number(decimalValue); // 转换十进制字符串 如果要将十六进制字符串转换为二进制,可以使用以下代码: QString hexString = "A1B"; // 十六进制字符串 bool ok; int decimalValue = hexString.toUInt(&ok, 16); // 将十六进制字符串转换十进制 QString binaryString = QString::number(decimalValue, 2); // 转换为二进制字符串 如果要将十六进制字符串转换十进制或二进制,请使用上述代码的相应部分。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [qt十进制转换十六进制和二进制字符串,以及二进制字符串十进制十六进制字符串](https://blog.csdn.net/blqzj214817/article/details/120955923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt十六进制字符串十六进制编码](https://blog.csdn.net/qq_15094525/article/details/105741389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值