4字节十六进制数据和大小端传输

Posted warmsnowfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4字节十六进制数据和大小端传输相关的知识,希望对你有一定的参考价值。

甲方使用的后台要求“整型数据采用小端传输”,大部分数据是4字节十六进制,有一些是2字节十六进制。

关于大小端传输,简单来说可以这样认为。

内存中低地址存最低有效字节的形式为小端传输

内存中低地址存最高有效字节的形式为大端传输

例如一个4字节十六进制数"0x11223344",装入QByteArray中。

如果取出结果如下

buff[0] == 0x44;

buff[1] == 0x33;

buff[2] == 0x22;

buff[1] == 0x11;

这里的"0"就表示低地址,0x44表示最低有效位。

 

Qt中关于大小端数据也有封装好的接口,头文件qendian.h或者QtEndian

主要记录一下进制之间的转换

技术图片
 1     const quint32 i =  1010;
 2     QString hex = QString("%1").arg(i, 8, 16, QLatin1Char(0));
 3     qDebug() << "hex " << hex;
 4     bool ok;
 5     qDebug() << hex.toInt(&ok, 16);
 6    
 7     //十进制转十六进制
 8     QByteArray buffer;
 9     buffer[0] = (i & 0xff);
10     buffer[1] = ((i >> 8) & 0xff);
11     buffer[2] = ((i >> 16) & 0xff);
12     buffer[3] = ((i >> 24) & 0xff);
13 
14     //十六进制转回十进制数
15     quint32 x = (buffer[0] & 0x000000ff)
16             |   ((buffer[1] << 8 )& 0x0000ff00)
17             |   ((buffer[2] << 16)& 0x00ff0000)
18             |   ((buffer[3] << 24)& 0xff000000);
19     qDebug() << "x" << x;
20     int c = 0;
21 
22     //十六进制转string
23     QString et;
24     while(c < 4){
25         QString str =QString("%1").arg(buffer[c]&0xFF,2,16,QLatin1Char(0));   //2 字符宽度
26         et += str;
27         c++;
28     }
29     qDebug() << "et " << et;
30     qDebug() << et.toInt(&ok, 16);
31     qDebug() <<"ok" << ok ;
32 
33 //返回小端数据接口使用
34     uchar *ptr = new uchar[4];
35     qToLittleEndian(i,ptr);
36     int c = 0;
37     while(c < 4){
38         buffer.append(ptr[c]);
39         c++;
40     }
41 
42     qToLittleEndian(i, ptr);
43     //qbswap<quint32>(i, ptr);
44 
45     qDebug("%02x,%p",ptr[0],&ptr[0]);
46     qDebug("%02x,%p",ptr[1],&ptr[1]);
47     qDebug("%02x,%p",ptr[2],&ptr[2]);
48     qDebug("%02x,%p",ptr[3],&ptr[3]);
View Code

 

以上是关于4字节十六进制数据和大小端传输的主要内容,如果未能解决你的问题,请参考以下文章

大小端模式

大小端模式

什么是大小端

请简述网络协议中,大小端和字节对齐的作用

请简述网络协议中,大小端和字节对齐的作用

请简述网络协议中,大小端和字节对齐的作用