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
    }
复制代码

 

//

posted @   小城熊儿  阅读(1065)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示