java 网络序_网络字节序的问题

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:4d5c53bbac]]字节序:[0][1][0][0] 高位到低位

经过转换以后,我们就可以通过

byte[]btValue=BitConverter.GetBytes(m);

得到一个长度为4的byte数组,然后将这个数组设置到报文的相应位置发送出去即可。

同样,收到报文后,可以将报文按域拆分,得到btValue,使用

int m=BitConverter.ToInt32(btValue,0);//从btValue的第0位开始转换

得到该域的值,此时还不能直接使用,应该再用网络到主机字节序的转换函数进行转换:

int x=IPAddress.NetworkToHostOrder(m);

这时得到的x才是报文中的实际值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值