C語言中QString與QByteArray互相轉(zhuǎn)換的方法
[1] QString與QByteArray互相轉(zhuǎn)換的方法
先要說的是QString。
之所以把QString單獨(dú)拿出來,是因?yàn)閟tring是很常用的一個(gè)數(shù)據(jù)結(jié)構(gòu),甚至在很多語言中,比如JavaScript,都是把string作為一種同int等一樣的基本數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的。
每一個(gè)GUI程序都需要string,這些string可以用在界面上的提示語,也可以用作一般的數(shù)據(jù)結(jié)構(gòu)。C++語言提供了兩種字符串的實(shí)現(xiàn):C風(fēng)格的 字符串,以’/0‘結(jié)尾;std::string,即標(biāo)準(zhǔn)模版庫中的類。Qt則提供了自己的字符串實(shí)現(xiàn):QString。QString以16位 Uniode進(jìn)行編碼。我們平常用的ASCII等一些編碼集都作為Unicode編碼的子集提供。關(guān)于編碼的問題,我們會到以后的時(shí)候再詳細(xì)說明。
在使用QString的時(shí)候,我們不需要擔(dān)心內(nèi)存分配以及關(guān)于’/0’結(jié)尾的這些注意事項(xiàng)。QString會把這些問題解決。通常,你可以把 QString看作是一個(gè)QChar的向量。另外,與C風(fēng)格的字符串不同,QString中間是可以包含’/0’符號的,而length()函數(shù)則會返回 整個(gè)字符串的長度,而不僅僅是從開始到’/0’的長度。
同Java的String類類似,QString也重載的+和+=運(yùn)算符。這兩個(gè)運(yùn)算符可以把兩個(gè)字符串連接到一起,正像Java里面的操作一樣。QString可以自動(dòng)的對占用內(nèi)存空間進(jìn)行擴(kuò)充,這種連接操作是恨迅速的。下面是這兩個(gè)操作符的使用:
QStringstr="User:"; str+=userName+"/n";
QString的append()函數(shù)則提供了類似的操作,例如:
str="User:"; str.append(userName); str.append("/n");
QString轉(zhuǎn)QByteArray方法
//Qt5.3.2 QString str("hello"); QByteArray bytes = str.toUtf8(); // QString轉(zhuǎn)QByteArray方法1 QString str("hello"); QByteArray bytes = str.toLatin1(); // QString轉(zhuǎn)QByteArray方法2
QByteArray轉(zhuǎn)QString方法
//Qt5.3.2 QByteArray bytes("hello world"); QString string = bytes; // QByteArray轉(zhuǎn)QString方法1 QByteArray bytes("hello world"); QString string; string.prepend(bytes);// QByteArray轉(zhuǎn)QString方法2 qDebug() << string;
QByteArray類同樣不以’\0’為結(jié)尾
QByteArray bytes; bytes.resize(5); bytes[0] = '1'; bytes[1] = '2'; bytes[2] = '3'; bytes[3] = '\0'; bytes[4] = 'a'; cout << bytes << endl;
QByteArray轉(zhuǎn)QString,主要用buf.toHex()即可
static QString ByteArrayToHexStr(QByteArray buf) { QString retStr; retStr.append(buf.toHex()); return retStr; }
[2] Qt開發(fā)串口通訊軟件中的數(shù)據(jù)轉(zhuǎn)換問題
在利用Qt進(jìn)行串口程序開發(fā)過程中,除了與串口通訊的功能實(shí)現(xiàn)以外,數(shù)據(jù)的轉(zhuǎn)換也是比較麻煩的一件事,本篇主要介紹串口通訊中數(shù)據(jù)轉(zhuǎn)換的問題,關(guān)于功能實(shí)現(xiàn)大家在網(wǎng)上搜索就能找到相關(guān)案例。
在完成串口的初始化等功能之后,實(shí)現(xiàn)數(shù)據(jù)的讀取轉(zhuǎn)換。
1.讀取串口命令-QByteArray轉(zhuǎn)QString,QString轉(zhuǎn)float
從串口接收到的數(shù)據(jù)形如:“0010101821…”的16進(jìn)制數(shù),串口返回QByteArray的數(shù)據(jù)格式,通過以下方式轉(zhuǎn)換為QString,再通過截取數(shù)據(jù)中某幾位,按照16進(jìn)制格式轉(zhuǎn)換為10進(jìn)制使用。
QByteArray轉(zhuǎn)QString
static QString serialBuffer; QByteArray serialBufferTmp=m_serialPort->readAll(); serialBuffer=serialBuffer.append(serialBufferTmp);
截取第8位后4位的16進(jìn)制數(shù),并QString轉(zhuǎn)float
QString strValue=serialBuffer.mid(8,4); float floatValue=strValue.toInt(nullptr,16)
2.向串口寫入命令
十進(jìn)制int轉(zhuǎn)16進(jìn)制格式string
通常我們從Qt開發(fā)的界面中使用QLineEdit輸入的是十進(jìn)制類型的,而為了串口處理需要將其轉(zhuǎn)換為16進(jìn)制格式,再通過處理成串口可以解析的格式,例如十進(jìn)制50轉(zhuǎn)換為16進(jìn)制的“32”,代碼如下:
int Num=dec2HexInputEdit->text().toInt(); QString hexString=QString::number(Num,16)?
16進(jìn)制數(shù)加法
此處參考Qt 十六進(jìn)制的簡單應(yīng)用, 十六進(jìn)制的加法,它是先將數(shù)轉(zhuǎn)換為10進(jìn)制,相加后再轉(zhuǎn)換為QString
QString hexAri(QString str, int addend) { bool ok; int dec = str.toUInt(&ok, 16); QString tmp = QString("%1").arg(dec + addend, 5, 16, QLatin1Char('0'); return tmp; }
[3] QT QString與QByteArray的相互轉(zhuǎn)換
QByteArray(const char *data, int size = -1) //QByteArray Str("1234") 內(nèi)存中存儲可能就是對應(yīng)的ASSIC:0x31, 0x32, 0x33, 0x34 QByteArray QByteArray::fromHex(const QByteArray &hexEncoded) //將字符串的“1234”變?yōu)?x11 0x34,原本占用4字節(jié)內(nèi)存,現(xiàn)在變?yōu)?字節(jié)。0x31, 0x32, 0x33, 0x34 ==> 0x12 0x34 QByteArray QByteArray::toHex() const //將0x12 0x34 變?yōu)?“1234” 原本占用2字節(jié)內(nèi)存,現(xiàn)在變?yōu)?字節(jié) 0x12 0x34 ==> 0x31, 0x32, 0x33, 0x34 int QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const //Str.toInt(&Ok, 16)將字符串 “1234”變?yōu)閕nt型 0x1234,, 轉(zhuǎn)換的前提:Str內(nèi)就是存的字符串,Str內(nèi)存的不是“0”--“9” “a”--“f”,不能轉(zhuǎn)換成功 QString(const QByteArray &ba) //可以將QByteArray轉(zhuǎn)換為字符串,我認(rèn)為內(nèi)存占用,以及數(shù)據(jù)都是一樣的,只是類型變了,原來QByteArray表示0x31 0x32 0x33 0x34, 還是同樣的數(shù)據(jù)用QString表示了 QString fromUtf8(const QByteArray &); //將QByteArray轉(zhuǎn)換為QSting。字符串的編碼方式不同,內(nèi)存占用以及數(shù)據(jù)就不同,但是都可以看成char[] 數(shù)組,在Qt中char 數(shù)組就是QByteArray,因此將不同編碼方式的字符串轉(zhuǎn)換為QString的函數(shù)入?yún)⒍际荙ByteArray QString number( A, B); //將數(shù)字轉(zhuǎn)換為字符串 將A轉(zhuǎn)變?yōu)锽進(jìn)制, A=10 B=16 轉(zhuǎn)換為“a” : 10 = 0x0A ; A=10 B=10 轉(zhuǎn)換為“10” int QString::toInt(bool *ok = Q_NULLPTR, int base = 10) const //base = 16,將字符串 “12”變?yōu)?0x12 QByteArray QString::toLatinl() const; //將QString編碼的字符串轉(zhuǎn)換到 其他類型的字符串編碼 QByteArray QString::toUtf8() const; //舉例: 字符串“1”,在內(nèi)存中就是0x31 (ASSIC 0x31表示1),只不過存儲方式是QString的編碼,假如Utf8與QString的編碼一樣,轉(zhuǎn)換出來后,還是0x31 QByteArray QString::toLocal8Bit() const; //假如 Local8Bit中 “1” 用16進(jìn)制0x88表示, 那么轉(zhuǎn)換后,內(nèi)存的數(shù)成了0x88, QByteArray QString;:toUCS4() const;
Latin1:SO-8859-1編碼是單字節(jié)編碼,向下兼容ASCII,其編碼范圍是0x00-0xFF
utf8字符集以2個(gè)或以上的字節(jié)表示一個(gè)漢字,實(shí)際上具體的數(shù)值和unicode有很大的相關(guān)性
unicode字符集以2個(gè)或以上的字節(jié)表示一個(gè)漢字。
gb18030字符集兼容了gbk字符集,以兩個(gè)字節(jié)表示一個(gè)文字。windows系統(tǒng)可能使用的就是這兩種的一種。
UCS:通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標(biāo)準(zhǔn)所定義的標(biāo)準(zhǔn)字符集。UCS-2用兩個(gè)字節(jié)編碼,UCS-4用4個(gè)字節(jié)編碼。
到此這篇關(guān)于C語言中QString與QByteArray互相轉(zhuǎn)換的方法的文章就介紹到這了,更多相關(guān)C語言 QString與QByteArray 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV + MFC實(shí)現(xiàn)簡單人臉識別
這篇文章主要為大家詳細(xì)介紹了OpenCV + MFC實(shí)現(xiàn)簡單人臉識別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08C語言中調(diào)用Swift函數(shù)實(shí)例詳解
這篇文章主要介紹了C語言中調(diào)用Swift函數(shù)實(shí)例詳解的相關(guān)資料,實(shí)現(xiàn)該功能可以通過定義全局的指向Blocks的對象指針來實(shí)現(xiàn),需要的朋友可以參考下2017-07-07C語言進(jìn)程程序替換的實(shí)現(xiàn)詳解
為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼2022-08-08C語言實(shí)現(xiàn)實(shí)驗(yàn)設(shè)備管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)實(shí)驗(yàn)設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06位運(yùn)算實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制
這篇文章主要介紹了位運(yùn)算實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的相關(guān)資料,需要的朋友可以參考下2015-03-03C語言接口與實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了C語言接口與實(shí)現(xiàn)方法,包括接口的概念、實(shí)現(xiàn)方法及抽象數(shù)據(jù)類型等,并配合實(shí)例予以說明,需要的朋友可以參考下2014-09-09用VC++6.0實(shí)現(xiàn)石頭剪刀布游戲的程序
最先看到這個(gè)游戲代碼是python版的,后來看到有小伙伴用VC++重寫了一遍,運(yùn)行之后發(fā)現(xiàn)有些小bug,便嘗試這修復(fù)了一下,并增加了些小功能,這里分享給大家。2015-03-03