轉自: https://blog.csdn.net/biersibao/article/details/82884719
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;
//或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