甲方使用的后台要求“整型数据采用小端传输”,大部分数据是4字节十六进制,有一些是2字节十六进制。
关于大小端传输,简单来说可以这样认为。
内存中低地址存最低有效字节的形式为小端传输
内存中低地址存最高有效字节的形式为大端传输
例如一个4字节十六进制数"0x11223344",装入QByteArray中。
按照字节左边为高位,右边为低位的规则。
如果取出结果如下
buff[0] == 0x44;
buff[1] == 0x33;
buff[2] == 0x22;
buff[3] == 0x11;
这里的"0"就表示低地址,0x44表示最低有效位;这样的传输方式为小端传输
Qt中关于大小端数据也有封装好的接口,头文件qendian.h或者QtEndian。
另外这个博客有更详细的解释和说明:
主要记录一下进制之间的转换


1 int c=254254;
2 QByteArray data((char*)&c,4);
3 QByteArray data0=intToByte(c);
4 QByteArray data1=QByteArray::fromHex(QString::number(c,16).toLatin1());
5 qDebug()<<data.toHex()<<data.toHex().toInt(NULL,16)<<data.mid(0,1).toHex()<<data.mid(1,1).toHex()<<data.mid(2,1).toHex()<<data.mid(3,1).toHex();
6 qDebug()<<data0.toHex()<<bytesToInt(data0);
7 qDebug()<<data1.toHex()<<data1.toHex().toInt(NULL,16);
8
9 const quint32 i = 1010;
10 QString hex = QString("%1").arg(i, 8, 16, QLatin1Char('0'));
11 qDebug() << "hex " << hex;
12 bool ok;
13 qDebug() << hex.toInt(&ok, 16);
14
15 //十进制转十六进制
16 QByteArray buffer;
17 buffer[0] = (i & 0xff);
18 buffer[1] = ((i >> 8) & 0xff);
19 buffer[2] = ((i >> 16) & 0xff);
20 buffer[3] = ((i >> 24) & 0xff);
21
22 //十六进制转回十进制数
23 quint32 x = (buffer[0] & 0x000000ff)
24 | ((buffer[1] << 8 )& 0x0000ff00)
25 | ((buffer[2] << 16)& 0x00ff0000)
26 | ((buffer[3] << 24)& 0xff000000);
27 qDebug() << "x" << x;
28 int c = 0;
29
30 //十六进制转string
31 QString et;
32 while(c < 4){
33 QString str =QString("%1").arg(buffer[c]&0xFF,2,16,QLatin1Char('0')); //2 字符宽度
34 et += str;
35 c++;
36 }
37 qDebug() << "et " << et;
38 qDebug() << et.toInt(&ok, 16);
39 qDebug() <<"ok" << ok ;
40
41 //返回小端数据接口使用
42 uchar *ptr = new uchar[4];
43 qToLittleEndian(i,ptr);
44 int c = 0;
45 while(c < 4){
46 buffer.append(ptr[c]);
47 c++;
48 }
49
50 qToLittleEndian(i, ptr);
51 //qbswap<quint32>(i, ptr);
52
53 qDebug("%02x,%p",ptr[0],&ptr[0]);
54 qDebug("%02x,%p",ptr[1],&ptr[1]);
55 qDebug("%02x,%p",ptr[2],&ptr[2]);
56 qDebug("%02x,%p",ptr[3],&ptr[3]);
20190319 新增
今天在做解压缩和压缩功能,使用libz.so库
测试代码:


QByteArray baSrc = "3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d22474232333132223f3e3c726f6f743e3c6a79646d3e3430353030313c2f6a79646d3e3c736262683e39393030";
QByteArray endSrc(baSrc.size()/2, '\0');
for(int i = 0; i < baSrc.size(); i += 2){
char tmp[3] = {0};
memcpy(tmp, (uchar*)baSrc.data()+i, 2);
endSrc[i/2] = strtol(tmp, 0 , 16);
}
QByteArray hexbuffer = QByteArray::fromHex(baSrc);
其中对数据流通过了两种方式构造十六进制的QByteArray。
数据流中单独的一个内存空间储存的是一个字符,构造之后储存的就是"0x3c"这样的十六进制字符串了。