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]);

原文地址:https://www.cnblogs.com/warmSnowFY/p/10525446.html

时间: 2024-08-06 01:58:01

4字节十六进制数据和大小端传输的相关文章

(转)大小端模式详解

int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2"); 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端. 请写一个C函数,若处理器是Big_end

[C/C++]_[初级]_[判断大小端序Little Endian Order]

场景: 1. 在读取硬盘数据和媒体数据时,需要根据读取的数据进行大小端序的转换,以正确识别数据.其中一个处理就是首先要判断cpu支持的大小端序情况才能转换. 2. Little Endian Order: 低地址存低位(整数的高低位)的数据. test.cpp #include <stdio.h> #include <iostream> using namespace std; //1.方法1,通过判断int的低位是否存储了数值. int IsLittleEndian1() { i

c/c++ int,float,short 大小端转换函数

unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) | ((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24); } float

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

关于大小端问题和字节序问题的一些总结

1.大小端是不同的对于数据在内存地址中的存放方式,不同的处理器(平台)的数据存储方式是不同.的如果 实现跨平台通信则大小端是不能忽视的问题. 大端模式:数据的高位存储在内存的低字节.ARM/PowerPC等处理器采用大端模式 小端模式:数据的地位存储在内存的低字节.Intel架构处理器采用小端模式. 如一个数据:0x12345678;对应内纯地址是0x00~0x03. 大端模式: 小端模式: 地址:0x00 0x01 0x02 0x03 地址:0x00 0x01 0x02 0x03 数据:0x1

请讲普通话——一场关于异构平台通信的风波(粘包&#183;大小端方式&#183;网络字节序)

一.引子 前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台.这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”.都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事.如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风! 就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧. 看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧

一场关于异构平台通信的风波(粘包&#183;大小端方式&#183;网络字节序)

一.引子 前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台.这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”.都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事.如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风! 就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧. 看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧

大小端模式与网络字节序

一.为什么会出现大小端模式? 不同的cpu采用的大小端模式不一致.X86是小端模式.而KEIL C51则为大端模式.很多的ARM,DSP都为小端模式.有些ARM处理器还可以由硬件来选择是大端模式还是小端模式. 二.大小端模式的不同带来的问题是什么?如何解决? 如果存在数据网络传输,如果大小端模式不一致,如果不经过转换,必然会导致数据不致,出现错误. 解决方法:统一将网络上传输的字节序采用同一种模式(大家都知道的),这样收发数据时,就会根据主机对应的模式是否和网络字节对应的模式一致,来判断是否需要

最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题. 什么是字节序? 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序 那么就很明显了,像char这样的类型,肯定不存在字节序的问题了. 字节序分为哪几类? 大端字节序: 高位字节数据存放在低地址处,低位数据存放在高地址处: 小段字节序: 高位字节数据存放在高地址处,低位数据存放在低地址处: 网络字节序: TCP/IP协议传输数据时,字