网络字节序的问题

殇丶莫愁

殇丶莫愁

2016-01-29 18:37

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

最近接触到网络字节序的概念 查了查资料 不是很明白 先引用一段材料:
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于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
展开更多 50%)
分享

猜你喜欢

网络字节序的问题

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
网络字节序的问题

VC中宽字节与窄字节转换问题

编程语言 网络编程
VC中宽字节与窄字节转换问题

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

怎么解决电脑网络问题

电脑 网络
怎么解决电脑网络问题

解决TCP网络传输“粘包”问题

编程语言 网络编程
解决TCP网络传输“粘包”问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C++多字节字符与宽字节字符相互转换

编程语言 网络编程
C++多字节字符与宽字节字符相互转换

理解oracle的网络结构 解决连接问题

编程语言 网络编程
理解oracle的网络结构 解决连接问题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

右键慢问题

右键慢问题

巧用WORD2000来编排试卷

巧用WORD2000来编排试卷
下拉加载更多内容 ↓