天天看點

Qt網絡傳輸中常見變量之間的互相轉換—————附帶詳細代碼

文章目錄

  • ​​0 背景​​
  • ​​1 QByteArray與int​​
  • ​​1.1 QByteArray【16進制】轉int​​
  • ​​1.2 int【10進制】轉QByteArray​​
  • ​​2 QByteArray與QString​​
  • ​​2.1 QByteArray轉QString​​
  • ​​2.1.1 QByteArray轉16進制的QString​​
  • ​​2.2 QString轉QByteArray​​
  • ​​2.2.1 16進制的QString轉QByteArray:​​
  • ​​3 QString和int​​
  • ​​3.1 QString轉int​​
  • ​​3.2 int轉QString​​
  • ​​4 結構體轉QByteArray​​
  • ​​5 char*和QByteArray​​
  • ​​5.1 char*轉QByteArray​​
  • ​​5.2 QByteArray轉char*​​
  • ​​6 QByteArray和unsigned char *​​
  • ​​6.1 QByteArray轉unsigned char *​​
  • ​​6.2 unsigned char *轉 QByteArray​​
  • ​​7 string和QString​​
  • ​​7.1 string轉QString​​
  • ​​7.2 QString轉string​​
  • ​​8 QString和char*​​
  • ​​8.1 QString轉char*​​
  • ​​8.1.1 法一​​
  • ​​8.1.1 法二​​
  • ​​8.2 char*轉QString​​

0 背景

因為TCP網絡傳輸資料的原因,經常要對一些資料進行進制轉換,然後才能進行發送,是以查閱了大量的資料加上自己的實踐整理出此文,友善日後查詢。

1 QByteArray與int

1.1 QByteArray【16進制】轉int

bool ok;//ok = true
    QByteArray s_length;
    int totalBytes = s_length.toHex().toInt(&ok, 16);      

測試代碼:

bool ok;
    QByteArray s_length;
    s_length[0] = 0x0F;
    int totalBytes = s_length.toHex().toInt(&ok, 16);
    qDebug()<<"totalBytes:"<<totalBytes;      

1.2 int【10進制】轉QByteArray

int i = 2;
    QByteArray res;
    res.resize(4);
    //小端存儲,資料的低位在位元組的高位
    res[3] = (unsigned char)(0x000000ff & i);
    res[2] = (unsigned char)((0x0000ff00 & i)>>8);
    res[1] = (unsigned char)((0x00ff0000 & i)>>16);
    res[0] = (unsigned char)((0xff000000 & i)>>24);
    QByteArray res;
    res.append((num&(0xff000000))>>24);
    res.append((num&(0x00ff0000))>>16);
    res.append((num&(0x0000ff00))>>8);
    res.append(num&(0x000000ff));      

測試代碼:

int i = 2;
    QByteArray res;
    res.resize(4);
    //小端存儲,資料的低位在位元組的高位
    res[3] = (unsigned char)(0x000000ff & i);
    res[2] = (unsigned char)((0x0000ff00 & i)>>8);
    res[1] = (unsigned char)((0x00ff0000 & i)>>16);
    res[0] = (unsigned char)((0xff000000 & i)>>24);
    bool ok = true;
    qDebug()<<res.toHex().toInt(&ok, 16);
    qDebug()<<"res:"<<res;      

由于小端存儲,int強轉char時,不需要做任何轉換,是以可以用于測試電腦端是大端還是小端:

bool isLittleEndian()
{
    int a=0x00000061;
    if((char)a=='a') return true;
    else return false;
}      

2 QByteArray與QString

2.1 QByteArray轉QString

QByteArray data;
    data.resize(2);
    data[0] = 0x68;
    data[1] = 0x72;
    QString str = static_cast<QString>(data);
   // qDebug()<      

2.1.1 QByteArray轉16進制的QString

QByteArray res;
    res.append(0x0A);
    QString temp =  res.toHex().toUpper();
    QString res2 = "";
    for(int i = 0;i < temp.size();i += 2){
        res2 += temp.mid(i,2) + " ";
    }
    res2 = res2.trimmed();//去除開頭和結尾的空格
    //qDebug()<<"res2:"<      

2.2 QString轉QByteArray

QString str = "江雪韓";
    QByteArray res = str.toUtf8();//中文
    //qDebug()<<"res:"<(res);
    QString str2 = "jxh";
    QByteArray res2 = str2.toLatin1();//英文
    //qDebug()<<"res2:"<(res2);      

2.2.1 16進制的QString轉QByteArray:

思路:先轉為10進制的int,再轉為QByteArray

QString str = "0x0A";
    bool ok;
    int num = str.toInt(&ok, 16);
    //qDebug()<<"num:"<
    QByteArray res;
    res.append((num&(0xff000000))>>24);
    res.append((num&(0x00ff0000))>>16);
    res.append((num&(0x0000ff00))>>8);
    res.append(num&(0x000000ff));
    //qDebug()<<"res:"<      

3 QString和int

3.1 QString轉int

bool ok = true;
    QString str("123456");
    int num = str.toInt(&ok, 10);//10可以換成任何想轉的進制
   // qDebug()<<"num:"<      

3.2 int轉QString

int num = 10;
    QString str = QString::number(num);
    //qDebug()<<"str:"<      

4 結構體轉QByteArray

typedef struct
{
    unsigned char MessageHeader;            /*消息頭結構體*/
    unsigned char MessageTail;                    /*消息尾結構體*/
}PicMessageRequestTypeDef;

    PicMessageRequestTypeDef answer;
    QByteArray answerMsg;
    answerMsg.append((char*)&answer, sizeof(answer));      

5 char*和QByteArray

5.1 char*轉QByteArray

char* c = new char[4];
    strcpy(c ,"jxh");
    //qDebug()<
    //qDebug()<
    QByteArray res = QByteArray::fromRawData((char*)c, strlen(c));
    //qDebug()<<"res:"<      

5.2 QByteArray轉char*

char* c;
    QByteArray arrayData;
    arrayData.append(0x68);
    arrayData.append(0x72);
    c = arrayData.data();
   // qDebug()<      

6 QByteArray和unsigned char *

6.1 QByteArray轉unsigned char *

QByteArray arrayData;
unsigned char *res = reinterpret_cast<unsigned char*>(arrayData.data());      

6.2 unsigned char *轉 QByteArray

QByteArray arrayData;
arrayData.append(0x68);
arrayData.append(0x72);
unsigned char * p = (unsigned char *)arrayData.data();      

7 string和QString

7.1 string轉QString

QString str = "jiangxueHan";
    std::string s = str.toStdString();      

7.2 QString轉string

std::string s = "jiangxueHan";
    QString str = QString::fromStdString(s);
    //qDebug()<<"str:"<      

8 QString和char*

8.1 QString轉char*

8.1.1 法一

QString str = "江雪韓";
    std::string s = str.toStdString();
    const char* c = s.c_str();
    qDebug()<<"c:"<<c;      

8.1.1 法二

QString先轉為QByteArray,再轉為char*

QString str = "江雪韓";
    QByteArray res = str.toUtf8();//中文
    //qDebug()<<"res:"<(res);
    QString str2 = "jxh";
    QByteArray res2 = str2.toLatin1();//英文
    //qDebug()<<"res2:"<(res2);
    char* c = res2.data();      

8.2 char*轉QString

char* c = new char[15];
    strcpy(c, "jiangxueHan");
    QString str = static_cast<QLatin1String>(c);
    qDebug()<<"str:"<<str;      
char* c = new char[15];
strcpy(c, "江雪韓");
QString str =QString::fromUtf8(c);
//qDebug()<<"str:"<      

繼續閱讀