//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 }
//