1. 程式人生 > >QT常用的型別轉換(QByteArray/QString/char*/uint8等)

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*,也就相當於轉成了位元組陣列,

參考:https://blog.csdn.net/lu_embedded/article/details/52465203

這篇文章提到了兩種方法:

(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