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 }
//
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构