c語言如何解決qstring與qbytearray互相轉換的問題
本文講解"c語言怎么解決qstring與qbytearray互相轉換的問題",希望能夠解決相關問題。
目錄- [1] qstring與qbytearray互相轉換的方法
- qstring轉qbytearray方法
- qbytearray轉qstring方法
- qbytearray類同樣不以’\0’為結尾
- [2] qt開發串口通訊軟件中的數據轉換問題
- 1.讀取串口命令-qbytearray轉qstring,qstring轉float
- 2.向串口寫入命令
- [3] qt qstring與qbytearray的相互轉換
[1] qstring與qbytearray互相轉換的方法
先要說的是qstring。
之所以把qstring單獨拿出來,是因為string是很常用的一個數據結構,甚至在很多語言中,比如javascript,都是把string作為一種同int等一樣的基本數據結構來實現的。
每一個gui程序都需要string,這些string可以用在界面上的提示語,也可以用作一般的數據結構。c++語言提供了兩種字符串的實現:c風格的 字符串,以’/0‘結尾;std::string,即標準模版庫中的類。qt則提供了自己的字符串實現:qstring。qstring以16位 uniode進行編碼。我們平常用的ascii等一些編碼集都作為unicode編碼的子集提供。關于編碼的問題,我們會到以后的時候再詳細說明。
在使用qstring的時候,我們不需要擔心內存分配以及關于’/0’結尾的這些注意事項。qstring會把這些問題解決。通常,你可以把 qstring看作是一個qchar的向量。另外,與c風格的字符串不同,qstring中間是可以包含’/0’符號的,而length()函數則會返回 整個字符串的長度,而不僅僅是從開始到’/0’的長度。
同java的string類類似,qstring也重載的+和+=運算符。這兩個運算符可以把兩個字符串連接到一起,正像java里面的操作一樣。qstring可以自動的對占用內存空間進行擴充,這種連接操作是恨迅速的。下面是這兩個操作符的使用:
qstringstr="user:"; str+=username+"/n";
qstring的append()函數則提供了類似的操作,例如:
str="user:"; str.append(username); str.append("/n");
qstring轉qbytearray方法
//qt5.3.2 qstring?str("hello");?? qbytearray?bytes?=?str.toutf8();?//?qstring轉qbytearray方法1? qstring?str("hello");?? qbytearray?bytes?=?str.tolatin1();??//?qstring轉qbytearray方法2
qbytearray轉qstring方法
//qt5.3.2 ????qbytearray?bytes("hello?world"); ????qstring?string?=?bytes;???//?qbytearray轉qstring方法1 ????qbytearray?bytes("hello?world"); ????qstring?string; ????string.prepend(bytes);//?qbytearray轉qstring方法2 ????qdebug()?<<?string;
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;
qbytearray轉qstring,主要用buf.tohex()即可
????static?qstring?bytearraytohexstr(qbytearray?buf) ????{ ????????qstring?retstr; ????????retstr.append(buf.tohex()); ????????return?retstr; ????}
[2] qt開發串口通訊軟件中的數據轉換問題
在利用qt進行串口程序開發過程中,除了與串口通訊的功能實現以外,數據的轉換也是比較麻煩的一件事,本篇主要介紹串口通訊中數據轉換的問題,關于功能實現大家在網上搜索就能找到相關案例。
在完成串口的初始化等功能之后,實現數據的讀取轉換。
1.讀取串口命令-qbytearray轉qstring,qstring轉float
從串口接收到的數據形如:“0010101821…”的16進制數,串口返回qbytearray的數據格式,通過以下方式轉換為qstring,再通過截取數據中某幾位,按照16進制格式轉換為10進制使用。
qbytearray轉qstring
static?qstring?serialbuffer; qbytearray?serialbuffertmp=m_serialport->readall(); serialbuffer=serialbuffer.append(serialbuffertmp);
截取第8位后4位的16進制數,并qstring轉float
qstring?strvalue=serialbuffer.mid(8,4); float?floatvalue=strvalue.toint(nullptr,16)
2.向串口寫入命令
十進制int轉16進制格式string
通常我們從qt開發的界面中使用qlineedit輸入的是十進制類型的,而為了串口處理需要將其轉換為16進制格式,再通過處理成串口可以解析的格式,例如十進制50轉換為16進制的“32”,代碼如下:
int?num=dec2hexinputedit->text().toint(); qstring?hexstring=qstring::number(num,16)
16進制數加法
此處參考qt 十六進制的簡單應用, 十六進制的加法,它是先將數轉換為10進制,相加后再轉換為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的相互轉換
qbytearray(const?char?*data,?int?size?=?-1)? //qbytearray?str("1234")??內存中存儲可能就是對應的assic:0x31,?0x32,?0x33,?0x34 qbytearray?qbytearray::fromhex(const?qbytearray?&hexencoded) //將字符串的“1234”變為0x11?0x34,原本占用4字節內存,現在變為2字節。0x31,?0x32,?0x33,?0x34?==>?0x12?0x34 qbytearray?qbytearray::tohex()?const //將0x12?0x34?變為?“1234”??原本占用2字節內存,現在變為4字節?0x12?0x34?==>?0x31,?0x32,?0x33,?0x34 int?qbytearray::toint(bool?*ok?=?q_nullptr,?int?base?=?10)?const //str.toint(&ok,?16)將字符串?“1234”變為int型?0x1234,,?轉換的前提:str內就是存的字符串,str內存的不是“0”--“9”?“a”--“f”,不能轉換成功 qstring(const?qbytearray?&ba) //可以將qbytearray轉換為字符串,我認為內存占用,以及數據都是一樣的,只是類型變了,原來qbytearray表示0x31?0x32?0x33?0x34,?還是同樣的數據用qstring表示了 qstring?fromutf8(const?qbytearray?&); //將qbytearray轉換為qsting。字符串的編碼方式不同,內存占用以及數據就不同,但是都可以看成char[]?數組,在qt中char?數組就是qbytearray,因此將不同編碼方式的字符串轉換為qstring的函數入參都是qbytearray qstring?number(?a,?b); //將數字轉換為字符串?將a轉變為b進制,?a=10??b=16??轉換為“a”?:??10?=?0x0a?;?a=10??b=10??轉換為“10” int?qstring::toint(bool?*ok?=?q_nullptr,?int?base?=?10)?const? //base?=?16,將字符串?“12”變為?0x12 qbytearray?qstring::tolatinl()?const;? //將qstring編碼的字符串轉換到?其他類型的字符串編碼 qbytearray?qstring::toutf8()?const; //舉例:?字符串“1”,在內存中就是0x31?(assic?0x31表示1),只不過存儲方式是qstring的編碼,假如utf8與qstring的編碼一樣,轉換出來后,還是0x31 qbytearray?qstring::tolocal8bit()?const;? //假如?local8bit中?“1”?用16進制0x88表示,??那么轉換后,內存的數成了0x88, qbytearray?qstring;:toucs4()?const;
latin1:so-8859-1編碼是單字節編碼,向下兼容ascii,其編碼范圍是0x00-0xff
utf8字符集以2個或以上的字節表示一個漢字,實際上具體的數值和unicode有很大的相關性
unicode字符集以2個或以上的字節表示一個漢字。
gb18030字符集兼容了gbk字符集,以兩個字節表示一個文字。windows系統可能使用的就是這兩種的一種。
ucs:通用字符集(universal character set, ucs)是由iso制定的iso 10646(或稱iso/iec 10646)標準所定義的標準字符集。ucs-2用兩個字節編碼,ucs-4用4個字節編碼。
關于 "c語言怎么解決qstring與qbytearray互相轉換的問題" 就介紹到此。希望多多支持碩編程。