QByteArray在串口通訊中經常被使用,通信處理過程中,經常會涉及到數據格式的轉換,有一定必要較爲全面詳細的對QByteArray數據轉換與處理部分進行闡述。本文通過以下幾個部分加以介紹:
主要內容
1、字符串發送與十六進制發送的區別
在使用串口發送數據時可以選擇字符串發送或者十六進制發送,通常情況下我們習慣選用字符串發送數據。關於兩者的區別,需要從計算機存儲數據的格式說起。
在計算機中,數據是以二進制的形式存儲的,例如十進制 1(10)在計算機中用 0000 0001(2)來表示。在使用字符串方式發送數據的時候,串口軟件首先將待數據轉換爲對應的ASCII碼,然後再將這些ASCII碼按照二進制的方式一位一位的發送出去;而使用十六進制方式發送數據的時候,串口直接將數據以二進制的方式一位一位的發送出去。
例如我們在串口軟件發送框輸入 “FF012345”,分別以字符串和十六進制兩種方式發送:
1.1字符串發送
串口以字符串發送數據,首先將字符串轉化爲ASCII碼對應的二進制,格式如下
0100 0110 | 0100 0110 | 0011 0000 | 0011 0001 | 0011 0010 | 0011 0011 | 0011 0100 | 0011 0101 |
---|---|---|---|---|---|---|---|
F | F | 0 | 1 | 2 | 3 | 4 | 5 |
串口發送了8個字節,若在接收端選擇字符串接收,則會接收到FF0123456這個字符串;若在接收端選擇十六進制接收,則會接收到:
0100 0110 | 0100 0110 | 0011 0000 | 0011 0001 | 0011 0010 | 0011 0011 | 0011 0100 | 0011 0101 這一串數字
1.2十六進發送
串口以十六進制發送數據,首先將發送框中數據轉化爲如下格式:
1111 1111 | 0000 0001 | 0010 0011 | 0100 0101 |
---|---|---|---|
0xFF | 0x01 | 0x23 | 0x45 |
串口發送了4個字節,若在接收端選擇十六進制接收,則會在接收框顯示FF 01 23 45;若在接收端選擇字符串接收,則會接收到亂碼
仔細對照接收結果就很容易明白字符串發送和十六進制發送的區別了。
2、QByteArray數據轉換與處理
從串口讀取到的QByteArray數據,一般需要進行提取和解析,此時就需要QByteArray轉換爲各類型數據。常用轉換包括:
1、字符與十六進制轉換,例如串口接收到的數據,用字符方式表達,或者將字符串對應的十六進制數據流轉化爲字符串;
2、轉爲不同進制數值並顯示,如二進制、八進制、十進制和十六進制等;
3、轉爲整型、浮點型等數值類型;
4、大小寫轉換;
5、轉爲字符串類型;
2.1 十六進制-字符
把Hex編碼的數據流轉換爲char存儲到QByteArray:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // "Qt is great!"
把QByteArray數據轉換爲字符串:
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return "303132"
2.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"
2.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, 轉爲十進制失敗
2.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"
2.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"