当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > 网络字节序的问题

Unix/Linux
linux查看内存的大小
在linux下写的代码,用的是utf-8,结果拿到XP下运行的时候,所有的中文都成乱码
linux su和sudo命令的区别
linux cron 下的定时执行工具使用技巧
linux 查找进程及终止进程操作的相关命令
redhat linux 安装 gcc编译器
Linux Mplayer播放各种格式的电影
一起回顾一下linux常用命令
Linux 网站项目发布要做哪些配置
linux SSH配合SecureCRT的密匙完美使用方法
GD 编译出错解决方法
Facebook Open Platform编译FAQ
Linux 系统硬盘 优化
linux 挂载详解
linux crontab定时命令
Linux 系统中确保访问三级域名畅通的方法
Linux 特权帐号VS普通帐号
确保Linux系统安全的前提条件 漏洞防护
Linux 监视系统资源使用率
Red Hat Linux上使用BIND建立DNS服务器

Unix/Linux 中的 网络字节序的问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 87 ::
收藏到网摘: n/a


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