如何使用Qt将维护网络数据的转成本地数据(大小端

2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
2011年10月 移动平台大版内专家分月排行榜第三2010年11月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。字节序(大小端)详解从高低地址和高低位开始理解
一、字节序定义
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。比如,以太网头部中2字节的“以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太网帧类型来说,在网络传输时,发送的顺序是0x08,0x06。在内存中的映象如下图所示:
栈底 (高地址)
---------------
0x06 -- 低位&
0x08&-- 高位
---------------
栈顶 (低地址)
该字段的值为0x0806。按照大端方式存放在内存中。
二、高/低地址与高低字节
首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:
----------------------- 最高内存地址 0xffffffff
&.&&&&&&&&&&&&& 栈
-----------------------
NULL (空洞)
-----------------------
&&&&&&&&&&&&&&& 堆
-----------------------
未初始化的数据
----------------(统称数据段)
初始化的数据
-----------------------
正文段(代码段)
----------------------- 最低内存地址 0x
以上图为例如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢[注1]?看下图:
栈底 (高地址)
----------
----------
栈顶 (低地址)
现在我们弄清了高低地址,接着来弄清高/低字节,如果我们有一个32位无符号整型0x(呵呵,恰好是把上面的那4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以unsigned int value = 0x为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)
在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。
例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址& 存放内容
&0x4001&&& 0x12
&0x4000&&& 0x34
而在Big-endian模式CPU内存中的存放方式则为:
内存地址& 存放内容
&0x4001&&& 0x34
&0x4000&&& 0x12
32bit宽的数0x在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址& 存放内容
&0x4003&&&& 0x12
&0x4002&&&& 0x34
&0x4001&&&& 0x56
&0x4000&&&& 0x78
而在Big-endian模式CPU内存中的存放方式则为:
内存地址& 存放内容
&0x4003&&&& 0x78
&0x4002&&&& 0x56
&0x4001&&&& 0x34
&0x4000&&&& 0x12
本文已收录于以下专栏:
相关文章推荐
高字节,低字节是什么意思?
一个16进制数有两个字节组成,例如:A9。高字节就是指16进制数的前8位(权重高的8位),如上例中的A。低字节就是指16进制数的后8位(权重低的8位),如上例中的9。
char型字节取高位和低位
最近在做一个查找的东西,必须把一个8为的字节分为两个部分,即把他们分为高四位和低四位的两个数据。因为一直是用的别人的一个比较的方式,自己也没有仔细的去看,大部分的情况...
Big Endian 和 Little EndianPeter Lee
一、字节序来自:/archives/1058846/谈到字...
int main(){
这里简单记录下两种转换方式:
1、int与byte[]之间的转换(类似的byte short,long型)
* 将int数值转换为占四个字节的byte数组,本...
【转】大端(高位先在低内存地址位置存储),小端(低位先在低内存地址位置存储)
端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将...
学习ASN.1过程中看到了涉及大小端的内容,感觉其中分析是我见过最清晰的了,因此就将其贴出,以供参考。
大小端(Bid Endian vs.
Little Endian)
来源于Swif...
字节序(大小端)详解从高低地址和高低位开始理解(转)
一、字节序定义
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字...
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。
再后来,他们又做了一些可以处理这些字节的机器...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)还没有帐号? 赶紧
文章日志用户版块群组帖子
如何使用Qt将网络数据转成本地数据(大小端转换)
UID:154703
在线时间10小时
金钱295威望36贡献值0好评度26
如题求网络数据转成本地数据(大小端转换)demo代码一份
UID:139154
在线时间393小时
金钱480威望56贡献值0好评度46
大小端转换可以用 &QtEndian&The &QtEndian& header provides functions to convert between little and big endian representations of numbers. T qToBigEndian(T src)void qToLittleEndian(T src, uchar * dest)
UID:97396
在线时间5065小时
金钱29125威望2919贡献值2好评度2911
或者可以考虑使用QDataStream,这个可以设置大小端,然后读出来的数据是对应本地的模式,本地的数据写入就会自动转换为设置的大小端
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
访问内容超出本站范围,不能确定是否安全
限100 字节
您目前还是游客,请
&回复后跳转到最后一页
Powered by & Copyright Time now is:11-29 10:38 &
版权所有 Gzip disabled&&& serverip.setAddress(QString(&192.168.0.7&));//这是人为指定ip地址的方法&&
&&& array.resize(2);
//&&& array[0]=0X00;
//&&& array[1]=0X04;
&&& char byte1=QString(&00&).toInt(&ok,16);
&&& char byte2=QString(&04&).toInt(&ok,16);
&&& array[0]=byte1;
&&& array[1]=byte2;
&&& clientudp-&writeDatagram(array,serverip,1111);//向1111端口写数据
上面是一段向udpsocket发送字节数组的代码,被注释掉的部分同样可用。char byte2=QString(&04&).toInt(&ok,16);表示将“04”按照16进制数解释为一个整型数(整型是一个数据类型,没有所谓的进制的区分,这里返回的整型默认用十进制表示),然后砍掉前24位赋值给一个char型。
另外网络中传输数据过程中(网线中)都是统一用的大端存储,但是数据发送前和接收后肯定字节序是保持一致的,不会颠倒,所以可以认为网络传输大小端方式是对程序猿透明的。(不过有时如果本地机器与此不符需要修正)。我在PC机与ARM上测试发现两者一致都是小端,无需修正
int hex=str.toInt(&ok,16);//将QString按照16进制数字来解释并返回十进制整型
QString(bytearray);//字节数组转换为QString
QByteArray::toHex(),fromH//不知道具体干嘛的
QByteArrayByte a=string.toA//不知道具体干嘛的
欢迎高手指正
本文已收录于以下专栏:
相关文章推荐
在上位机通讯中,根据通讯协议,有时候需要发送16进制的数据,本人在编程的时候容易把各种数据字面值和实际值搞混淆,故写这篇文章给大家参考,也给自己提醒。
在Qt中串口的接收和发送的数据类型都是QByte...
通过一些简单的代码可以查询到本机QT中变量的长度:
qDebug()qDebug()
qDebug()qDebug()
在我的计算机中,显示的数据是:
即在我的计...
在调用CAN动态库的调用中使用了BYTE
Data[8]数组
需要将这个数据帧显示出来,我的显示函数是在使用append 显示
需要将Data类型先进行转换为字节数组类型QByteArray
QT中的数据类型--转自
- Global Qt Declarations
http://doc./latest/qtglobal...
背景介绍:
最近在做Qt串口相关PC机软件的开发。于是涉及到很多IO的操作,而IO的接收经常会存放在QByteArray里面。于是QByteArray和QString之间的转换就不可避免。
基于qt实现十六进制收发
在lineEdit输入数据的类型是QString类型,以往我在发送的时候是ASCII方式发送,这会儿突然遇到一个是十六进制发送/接受的下位机,就需要将QString 转化为十六进制,本来直接用toHe...
本文记录自己在使用Qt过程中遇到的坑,有些是自己疏忽或认识不足导致的问题,有些是Qt自身的bug或陷阱。本文旨在总结自己遇到的问题和解决方法。
----------------------------...
示例代码:
a.resize(3);
byte b=0xfF;
qDebug("a[1]is X%",a[1]);
qDebug("a[1...
摘自博客:http://blog.csdn.net/xgbing/article/details/7771898
QByteArray与QString之间的转换:
QByteArray ...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 国家鼓励开发网络数据 的文章

 

随机推荐