QT里面的數據轉化成十六進制比較麻煩,其他的int或者byte等型都有專門的函數,而十六進制沒有特定的函數去轉化,這我在具體的項目中已經解決(參考網上大神)->小項目程序
QT里面雖然有什么QString str; str.toInt();等函數,但是用不好的話,會出很大的問題。
QByteArray:這個東西可以存放很多數據,16進制的數據、字符串類的數據等。
下面這個data接受的是16進制數據,現在想顯示出來就得轉化成QString,然后再轉化成int類型用於計算
1 QByteArray data=tcpSocket->readAll(); //接受16進制
1 QString p = data.toHex(); 2 ui->clearLineEdit->setText(p); //轉化成Qstring
data.toInt(0,16) //轉化成int
注意:data.toInt(),直接使用不行!
接下來是接受字符串的轉化,
1 QByteArray data=tcpSocket->readAll(); //接受的是字符串
QString p = QString(data); //直接轉化就行了
最后是十進制轉化成十六進制的問題(主要用在串口和TCP上面),下面程序有幾種表述:
1.char p[3]={0x11,0xab,0x0b}; 把里面的數據轉化成0x11ab0b發送!
2.int p[3] = {170,170,170}; 把里面數據轉化成0xaaaaaa發送!
實現的功能都是一樣的,第二種簡單一點,下面以第二種為例,第一種類似!
QString a1; for(int j=0;j<7;j++) { if(my_class->g_data[j]<16) a1+='0'+QString::number(my_class->g_data[j], 16).toUpper();//防止有0x0a,程序會轉換成'a',我們要的是轉換成'0a' else a1+=QString::number(my_class->g_data[j], 16).toUpper(); }
//將字符型進制轉化為16進制
97 QByteArray MainWindow::QString2Hex(QString str)
98 {
99 QByteArray senddata;
100 int hexdata,lowhexdata;
101 int hexdatalen = 0;
102 int len = str.length();
103 senddata.resize(len/2);
104 char lstr,hstr;
105 for(int i=0; i<len; )
106 {
107 hstr=str[i].toLatin1(); //字符型
108 if(hstr == ' ')
109 {
110 i++;
111 continue;
112 }
113 i++;
114 if(i >= len)
115 break;
116 lstr = str[i].toLatin1();
117 hexdata = ConvertHexChar(hstr);
118 lowhexdata = ConvertHexChar(lstr);
119 if((hexdata == 16) || (lowhexdata == 16))
120 break;
121 else
122 hexdata = hexdata*16+lowhexdata;
123 i++;
124 senddata[hexdatalen] = (char)hexdata;
125 hexdatalen++;
126 }
127 senddata.resize(hexdatalen);
128 return senddata;
129 }
130 //將1-9 a-f字符轉化為對應的整數
131 int MainWindow::ConvertHexChar(char ch)
132 {
133 if((ch >= '0') && (ch <= '9'))
134 return ch-'0';
135 else if((ch >= 'A') && (ch <= 'F'))
136 return ch-'A'+10;
137 else if((ch >= 'a') && (ch <= 'f'))
138 return ch-'a'+10;
139 else return (-1);
140 }
上面的程序就是先轉換成16進制的QString,千萬別寫直接number()沒有里面參數的轉換!
這是我寫TCP發送程序的小小總結,網上喲很多這種資料,但是有很多不適合,總結一下,QT里面的數據轉換一定要明確進制和類型,其次是調用函數里面參數寫具體!