1. 程式人生 > >串列埠通訊之 QByteArray詳解

串列埠通訊之 QByteArray詳解

QByteArray在串列埠通訊中經常被使用,有一定必要較為全面詳細的對QByteArray進行闡述。本文通過以下幾個部分加以介紹

1 初始化

2 訪問與賦值   

訪問QByteArray主要有4中方式,分別為[]、at()、data[]和constData[]。其中[]和data[]為可讀可寫,at()和constData[]僅為可讀。如果僅是讀,則通過at()和constData[]訪問速度最快,因可避免複製處理。示例如下:

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;    //方法一
qDebug()<<str ;
//輸出:"abc123"    
QByteArray ba("abc123");
QString str;
str = str.prepend(ba);    //方法二
qDebug()<<str ;
//輸出:"abc123"   

QString轉為QByteArray示例:

QString str("abc123");
QByteArray ba = str.toLatin1();    //方法一
qDebug()<<ba;
QString str("abc123");
QByteArray ba = str.toUtf8();   //方法二
qDebug()<<ba;

6. QByteArray類同樣不以’\0’為結尾:如

QByteArray bytes;  
bytes.resize(5);  
bytes[0] = '1';  
bytes[1] = '2';  
bytes[2] = '3';  
bytes[3] = '\0';  
bytes[4] = 'a';  

cout << bytes << endl; 

=======================以上內容為摘抄筆記,謝謝===============================================