QT常用的型別轉換(QByteArray/QString/char*/uint8等)
後續會繼續補充。
目錄:
1、位元組陣列(char*、uint8、int8)轉QByteArray類
2、QByteArray類轉位元組陣列(char*、uint8、int8)
3、位元組陣列轉hex字串
4、位元組陣列(char*、uint8、int8)轉QString
5、QString轉位元組陣列(char*、uint8、int8)
6、單個數字、字串,互轉
QByteArray類提供了類似陣列的功能,但功能更強大,常用函式:
只讀元素at(n)、讀寫元素[n]、追加元素append(可以追加QString、char*、char、QByteArray)、迭代器、元素儲存區指標data()
1、位元組陣列轉QByteArray類(位元組陣列是指uint8、int8、char的陣列)
直接使用QByteArray的建構函式即可,
const char *str="abcde";
char u8_arr[3]={0xa1,0xC2,0x3E};
QByteArray qa1(str);
QByteArray qa2(u8_arr,3);
QByteArray 的元素儲存地址可以通過成員函式data()獲得,使用*data可以訪問QByteArray 的元素
注意:如果陣列中有'\0',那麼構造QByteArray物件時,碰到陣列的\0構造就停止了
2、QByteArray類轉位元組陣列(char*、uint8、int8)
直接使用QByteArray的成員函式即可
QByteArray ba("abcd");
char *pArr = ba.data();
3、位元組陣列轉hex字串(位元組陣列是指uint8、int8的陣列)
uint8 u8_arr[3]={0xF5,0x07,0xa5};
QByteArray qa2(u8_arr,3);
QString qstr(qa2.toHex());//
qDebug()<<qstr.toUpper();//輸出字串:F507A5
QByteArray的toHex()的返回值仍為QByteArray型,因為每一個位元組都會變成2個hex字元,所以返回的QByteArray的長度是原來的兩倍。4、位元組陣列(char*、uint8、int8)轉QString
如果位元組陣列有字串結尾符\0,則可以直接使用QString的建構函式構造QString物件。
如果位元組陣列沒有\0,可以先把位元組陣列轉成QByteArray,然後用QByteArray構造QString,參考第1條
5、QString轉位元組陣列(char*、uint8、int8)
QString轉成了char*,也就相當於轉成了位元組陣列,
這篇文章提到了兩種方法:
(1)QString中無中文:
QString str;
char* ch;
QByteArray ba = str.toLatin1(); // 這一行不可少
ch=ba.data();//不允許這樣用:ch=str.toLatin1().data();
QString中有中文:避免亂碼,需要使用QTextCodec
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QByteArray ba = str.toLocal8Bit(); // toLocal8Bit 支援中文
注意:QString的toLatin1函式返回的QByteArray 是帶\0的另外這篇文章還提到,第三行不可少,如果直接這樣轉:ch=str.toLatin1().data(),會出錯。我認為原因是這樣的:toLatin1的返回值是值傳遞,而不是引用傳遞,使用值傳遞來傳返回值,返回值是位於記憶體棧上的,語句結束之後,返回值作為一個臨時區域性變數,被出棧,這時再使用.data()取指標,指標指向的位置已被出棧,不存在了,為了避免這種情況,就是把toLatin1的返回值使用區域性變數甚至區域性靜態變數接收過來,例如這裡的ba變數,toLatin1的返回值出棧消失了,但是ba還在,所以再使用ba.data()就可以獲取一個有效指標。
(2)先將 QString 轉為標準庫中的 string 型別,然後將 string 轉為 char *
QString filename;
std::string str = filename.toStdString();
const char* ch = str.c_str();
6、單個數字、字串,互轉
(1)數字轉字串兩種方法:
①
int num = 1000;// 1000 = 0x03E8;
QString str = QString("%1").arg(num,4,16,(QChar)'0').toUpper();
這種方法可以把陣列轉為16進位制樣式"03E8"、10進位制樣式的字串"1000"、8進位制樣式等② QString::number(double n, char format = 'g', int precision = 6),
如QString str = QString::number(1000);//str="1000"
(2)字串轉數字:
使用QString的成員函式即可:.toInt、toDouble等
字串的樣式可通過形參指定,如
QString str = "123";
bool OK;
int a = str.toInt(&OK, 10);// a=123,OK=true
int b = str.toInt(&OK, 16);// b=0x123,OK=true