C語言如何解決QString與QByteArray互相轉(zhuǎn)換的問題

c語言如何解決qstring與qbytearray互相轉(zhuǎn)換的問題

本文講解"c語言怎么解決qstring與qbytearray互相轉(zhuǎn)換的問題",希望能夠解決相關(guān)問題。

目錄
  • [1] qstring與qbytearray互相轉(zhuǎn)換的方法

    • qstring轉(zhuǎn)qbytearray方法

    • qbytearray轉(zhuǎn)qstring方法

    • qbytearray類同樣不以’\0’為結(jié)尾

  • [2] qt開發(fā)串口通訊軟件中的數(shù)據(jù)轉(zhuǎn)換問題

    • 1.讀取串口命令-qbytearray轉(zhuǎn)qstring,qstring轉(zhuǎn)float

    • 2.向串口寫入命令

  • [3] qt 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可以自動的對占用內(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類同樣不以&rsquo;\0&rsquo;為結(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&hellip;”的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)換的問題" 就介紹到此。希望多多支持碩編程。

下一節(jié):c++中的可移植性和跨平臺開發(fā)教程詳解

c語言編程技術(shù)

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频