网络字节序的问题

2016-01-29 18:37 7 1 收藏

网络字节序的问题,网络字节序的问题

【 tulaoshi.com - Linux 】


最近接触到网络字节序的概念 查了查资料 不是很明白 先引用一段材料:
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。
在本LINUX的书里介绍到INTEL的CPU使用的小端字节序 其他比MOTOROLA
68000系列CPU使用的是大端字节序 如果不转换 将数据通过网络发出时 比如MOTOROLA发一个16位数据:0X1234 传送到INTEL时
就被INTEL解释为0X3412 也就是4660成了13330 所以有时候需要一些函数来进行大小端字节序的转换
关于这大小字节序的概念不是很想的明白 数据在
内存里是具体怎么存放的形式?为什么会有CPU解释的不同?数据不是按12345678……这样的顺序一直排列的么?希望大人赐教 谢谢
xuechao 回复于:2003-11-20 17:11:57 没人顶吗?各位给条路啊
流氓无产者 回复于:2003-11-20 18:57:00 不就是大小印地安记法吗
1)从低到高存 (liittle edian)
例:0x1234
内存中是0x34 0x12
2)从高到低存 (big edian)
例:0x1234
内存中是0x12 0x34
sky-walker 回复于:2003-11-20 19:43:46 如: 一个多字节值 0xFECDBA98,内存从地址100开始存放

降序: FE | CD | BA | 98---->对应地址100 | 101 | 102 | 103
升序: 98 | BA | CD | FE ---->same above
注意,我们的书写表示法是从低字节位--->高字节位

至于为什么CPU解释不同,可能是由于不同的体系构架在起始竞争时人为地制造
和对手不兼容性......害的我们这么惨,一遇到移植就要注意这个 :twisted:
C代码的移植相对简单原因之一就是由于C的连续存储数据永远保持从低地址到高
地址的索引........
xuechao 回复于:2003-11-20 22:32:27 小端字节序就是升序排列那种?
我们的书写表示法是从低字节位--->高字节位 这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?
还有它排列是按单个字节来 还是按数据类型的?比如说是INT型就按两个两个排 就象0X1234 和0X3412 而不是0X1234 和0X4321?
sky-walker 回复于:2003-11-20 23:32:56 "我们的书写表示法是从低字节位--->高字节位 这个是什么意思呢?难道FECDBA98是从低到高(从左到右)吗?"


"还有它排列是按单个字节来 还是按数据类型的"
对于多字节数据才有这么一出
这样理解吧
譬如:
内存地址生长方向为: 从左到右 由低到高(这是不变的)
数据为: 0x89ABCDEF
降序(Big-endian)大端字节序 存储时 由左到右
升序(Little-endian)小端字节序 存储时 由右向左
可以自己编一个小程序验证一下(用C的数组)
更简单的调用VC里的checkEndian()
xuechao 回复于:2003-11-21 13:22:25 understood
thanx!!
wqch 回复于:2004-04-27 15:05:29 关于网络字节序和主机字节序的转换 ytjia(原作) 关键字 网络字节序,Socket 主机和网络字节序的转换 最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换。字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序。 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序。原以为还要自己写函数,其实网络库已经提供了。 主机到网络:short/int/long IPAddress.HostToNetworkOrder(short/int/long) 网络到主机:short/int/long IPAddress.NetworkToHostOrder(short/int/long) 主机字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处,如: int x=1; //此时x为主机字节序:[1][0][0][0] 低位到高位 int y=65536 //此时y为主机字节序:[0][0][1][0] 低位到高位 我们通过主机到网络字节序的转换函数分别对x和y进行转换得到他们对应的网络字节序值,网络节序是高字节数据存放在低地址处,低字节数据存放在高地址处,如: int m=IPAddress.HostToNetworkOrder(x); //此时m为主机[[color=red:4d5c53bbac]改为网络[/color:4d5c53bbac]]字节序:[0][0][0][1] 高位到低位 int n=IPAddress.HostToNetworkOrder(y); //此时n为主机[[color=red:4d5c53bbac]改为网络[/color:4d

来源:http://www.tulaoshi.com/n/20160129/1506606.html

延伸阅读
网络管理阶层的工作就是保证网络的正常工作,从而使得职工们的工作不被打断。可问题在于事物并非总是按照理想状况发展,事实上经常会出现平地起风波的状况。其间有许多原因,这里我们只讨论10种较为常见的网管错误。 1.UPS(不间断电源)的使用问题 某商店正在压榨它的网络系统的最后生命。尽管那台很老的服务器几乎难以满足商...
网络拥挤现象的基本症状是网络的某一部分或整个网络性能低劣。在高峰期,可能这只是暂现象。在其他情况下,这种现象可能逐渐漫延持续几周或几个月的时间,直到最后使网络性能降低到无法容忍的水平。 引起网络拥挤现象的原因有多种。需要用网络监视器来确定整个网络正在使用的带宽情况、高峰使用次数,以及正在传输的分组类型。协议分...
胶囊日记网络出问题怎么办   胶囊日记ios版提示网络出问题了,再试一次吧怎么办? 目前胶囊日记ios版还不是很稳定,官方也没有持续维护所以经常会出现一些故障问题。 原www.Tulaoshi.com因一:网络问题,请检查网络。 原因二:胶囊日记app版本过旧问题,请检查更新最新版本软件。 原因三:胶囊日记app与手机...
标签: windows 操作系统
考试即将结束,学生上交答案时,很多学生机出现了这样的提示:“由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机”,导致学生无法通过学生机把试卷传到教师机上。 怎么解决呢?时间非常紧,因为再隔半个小时,就有下一场学生进行考试。这时我突然想起前些日子从Windows 98安装盘中安装了一个组件——网络监视器,它可...
标签: windows系统
解决安装Windows8系统后C盘空间显示0字节问题   用户在安装Windows8系统的时候,C盘分的太小只有20G,结果装上Win8后C盘经常用到0字节!下面教大家解决办法。 操作步骤 1、 无奈之余,做了个艰难的决定:重装Win8,C盘和D盘合并!悲催的是,安装时删出C盘和D盘后,两个盘并没有合并到一起!这时才猛然想起,一个是主分区一...

经验教程

596

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部