QByteArray HexStringToByteArray(QString HexString) { bool ok; QByteArray ret; HexString = HexString.trimmed(); HexString = HexString.simplified(); QStringList sl; for(int i=0; i<HexString.length()/2; i++) { sl.append(HexString.mid(i*2, 2)); } foreach (QString s, sl) { if(!s.isEmpty()) { char c = s.toInt(&ok,16)&0xFF; if(ok){ ret.append(c); }else{ qDebug()<<QString::fromLocal8Bit("非法的16进制字符:")<<s; } } } qDebug()<<ret; return ret; } QByteArray baRsuData = HexStringToByteArray("FFFF58B40C120AFE01000000090000891700000000B9F3D6DDB8DFCBD91611520113282202000961892014112420441124B9F3414B44313538000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000010000000000AA290014514407A15D42BCFE00010300000000000000000067DE7901B9F3414B443135380000000015000000C1FF");
QString(baRecv.toHex().toUpper())
定义变量 unsigned long long a=0x1122334455667788
变量a是一个64位的无符号整数,共须要8个字节来存储,那么在两种模式下是如何存储的呢?
||--1--||--2--||--3--||--4--||--5--||--6--||--7--||--8--|| 地址
|| 11 || 22 || 33 || 44 || 55 || 66 || 77 || 88 || 大端模式
|| 88 || 77 || 66 || 55 || 44 || 33 || 22 || 11 || 小端模式网络
在咱们平常使用的x86架构的计算机中(其余类别的可能会采用大端模式或可配置模式,能够经过查阅资料或者用下文的代码进行测试),都是使用的小端模式,而网络字节序是大端模式的。架构
文件存储中的模式app
文件的存储通常都是以字节来进行操做的,所以,在文件中以什么样的字节序须要程序的编写者加以注意。比方说下面的程序:编辑器
int a=0x11223344; FILE *fp; fp=fopen("test","wb"); fwrite(&a,sizeof(a),1,fp); fclose(fp);
用十六进制编辑器打开文件以后,咱们会发现文件的内容是44332211。缘由很简单,fwrite函数直接把内存中的内容按顺序写入了文件,所以内存中是小端模式存储的,因此写入文件也是小端模式。函数
优缺点测试
大端模式,因为符号位和数值的高位存在地址的低位,会优先被读到,更容易先肯定数据的重要信息。spa
小端模式,在进行类型转换的时候不须要调整数据。如int强制转换到char,计算机不须要作任何调整,直接读取int的第一个字节便可。.net
Qt中大端小端的转换blog
Qt中<QtEndian>包含了大端小端转换的几个函数内存
T qFromBigEndian(const uchar * src) T qFromBigEndian(T src) T qFromLittleEndian(const uchar * src) T qFromLittleEndian(T src) void qToBigEndian(T src, uchar * dest) T qToBigEndian(T src) void qToLittleEndian(T src, uchar * dest) T qToLittleEndian(T src)
下面对几个函数进行说明
union{ int a; char b[4]; }test1,test2; test1.a=0x61626364; test2.a=qFromBigEndian(test1.a); qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3]; qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];
对于qFromBigEndian()函数,它会判断执行程序的主机的字节序,若是是大端模式的计算机,那么只是读取数据,不进行转换,若是是小端模式的计算机,那么则进行转换。
所以我在本机(小端模式)上的的执行结果是:
d c b a
a b c d
能够看出,它将数据进行了转换。
对于qFromLittleEndian()函数,和前者相似。对于大端模式的计算机进行转换,对于小端模式的计算机只是读取数据。
union{ int a; char b[4]; }test1,test2; test1.a=0x61626364; test2.a=qFromLittleEndian(test1.a); qToBigEndian(test1.a,(uchar*)test2.b); qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3]; qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];
对于qToBigEndian()函数,也有着上面的规则,对于小端模式的计算机进行转换,对于大端模式的计算机只进行读取。
所以,本机(小端模式)的执行结果是:
d c b a
a b c d对于qToLittleEndian()函数,只对大端模式的计算机进行转换。须要注意的是,Qt中的模板T只针对有符号和无符号的整型,对于浮点型(通常也不会用到),须要进行强制类型转换。原文:https://blog.csdn.net/usownh/article/details/42614185