1. 程式人生 > >QT十進位制十六進位制字串轉換

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