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]);
以上是关于4字节十六进制数据和大小端传输的主要内容,如果未能解决你的问题,请参考以下文章