Qt 關於直接內存復制,賦值給char short int值案例


//qt 直接從內存中讀取數據賦值給 int short char 這類有符號的數據 具體案例如下,注解為內存中int 的數據存放類型,不過觀察以后才發現,小端數據存放,帶符號位高位空余字節竟然填寫ff 飛不帶符號位,高位全是0,后面想想,這樣寫的包容性真的很強大

 

#include <QCoreApplication>

#include <QDebug>
#define myDebugMsg(msg) qDebug()<<QString("[Debug] File:%1     Line:%2     Function:%3     Msg:%4").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__).arg(msg)
#define myDebug qDebug()<<QString("[Debug] File:%1     Line:%2     Function:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__)

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    unsigned char datauchar[24] = {0};
    int a0 = -127;//81ffffff
    char a1 = -a0;//7f
    datauchar[0]=a0;
    datauchar[1]=a1;
    int b0 = -32767;//0180ffff
    short b1 = -b0;//ff7f
    memcpy( (datauchar+2),&b0,2);
    memcpy( (datauchar+4),&b1,2);
    int c0 = -2147483647;//01000080
    int c1 = -c0;//ffffff7f
    int c2 = c1+c0-1;//ffffffff
    memcpy( (datauchar+10),&c0,4);
    memcpy( (datauchar+14),&c1,4);
    memcpy( (datauchar+18),&c2,4);


    QString datastr = "";
    for(int i=0;i<24;i++){
        QString tem = "00"+ QString::number(*(datauchar+i),16);
        datastr += tem.right(2);
    }
    myDebugMsg(datastr);

    unsigned char dataucharafter[24] = {0};
    for(int i=0;i<24;i++){
        dataucharafter[i] = datastr.mid(2*i,2).toUInt(Q_NULLPTR,16);
    }
    char _a1 = 0;
    char _a0 = 0;
    memcpy(&_a1,dataucharafter+1,1);
    memcpy(&_a0,dataucharafter+0,1);

    short _b1 = 0;
    memcpy(&_b1,dataucharafter+4,2);
    short _b0 = 0;
    memcpy(&_b0,dataucharafter+2,2);

    int _c0 = 0;
    int _c1 = 0;
    int _c2 = 0;
    memcpy( &_c0,dataucharafter+10,4);
    memcpy( &_c1,(dataucharafter+14),4);
    memcpy( &_c2,(dataucharafter+18),4);

    myDebugMsg(QString::number(_a0));
    myDebugMsg(QString::number(_a1));
    myDebugMsg(QString::number(_b0));
    myDebugMsg(QString::number(_b1));
    myDebugMsg(QString::number(_c0));
    myDebugMsg(QString::number(_c1));
    myDebugMsg(QString::number(_c2));
    myDebug;

    unsigned char a5 = 9;//09
    char a5_ = 9;//09
    unsigned char a6 = 254;//fe
    unsigned short b5 = 254;//fe00
    short b5_ = 254;//fe00
    unsigned short b6 = 65535;//ffff
    unsigned int c5 = 1;//01000000
    int c5_ = 1;//01000000
    unsigned int c6 = 65535;//ffff0000
    unsigned int c7 = 2147483647;//ffffff7f

    myDebug;


    return a.exec();
}

 

2021.09.08   新發現一種寫法,並且效率賊高 

//整體是小端,因此需要轉換過來
            QString _data = data;data = "";
            for(int k=(_data.length()/2-1);k>=0;k--){ data += _data.mid(2*k,2); }
                 if(strType.contains("u8")){   _v = data.toInt(nullptr,16); }
            else if(strType.contains("s8")){   _v = (char)data.toInt(nullptr,16);}
            else if(strType.contains("u16")){  _v = data.toInt(nullptr,16);}
            else if(strType.contains("s16")){  _v = (short)data.toInt(nullptr,16);}
            else if(strType.contains("u32")){  _v = data.toUInt(nullptr,16);}
            else if(strType.contains("s32")){  _v = data.toInt(nullptr,16);}
            else if(strType.contains("u64")){  _v = data.toULongLong(nullptr,16);}
            else if(strType.contains("s64")){  _v = data.toLongLong(nullptr,16);}

小demo測試如下

    {

        int a = (short)QString("FFFE").toInt(nullptr,16);
        short b = (short)QString("FFFF").toInt(nullptr,16);
        int c = b;

        myDebugMsg(QString::number(a));//-2
        myDebugMsg(QString::number(b));//-1
        myDebugMsg(QString::number(c));//-1
    }

    {
        QString data = "12345678";
        QString _data = data;data = "";
        for(int k=(_data.length()/2-1);k>=0;k--){ data += _data.mid(2*k,2); }
        myDebugMsg(data);//78563412
    }

 

//


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM