[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[整理]Byte Order 字节顺:BIG-ENDIAN 和 LITTLE-ENDIAN

上一篇:[转帖]Java NIO类库Selector机制解析
下一篇:[整理]使用Ant调用PDE自动Build RCP Application。

添加日期:2011/2/17 16:08:07 快速返回   返回列表 阅读5062次
整理了一下:

1.BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关。
比如int,short,long型,而对单字节数据byte却没有影响。

BIG-ENDIAN就是高位字节排放在内存的低端,低位字节排放在内存的高端,
而LITTLE-ENDIAN正好相反。

比如数字0×12345678两种不同字节序的存储顺序如下所示:

Big Endian

低地址                           高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     12     |      34    |     56      |     78    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址                           高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     78     |      56    |     34      |     12    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。
而little endian,!@#$%^&*,见鬼去吧 -_-|||

注意,对单个Byte来说,没有顺序的说法,它是12就是12,绝不会变为21。

顺序是说,一个,数字,存储时,多个字节间的顺序。

多个数字,谁在前,谁在后,是另外一码事,你爱怎么排就怎么排!



2.

①BIG-ENDIAN还是LITTLE-ENDIAN,跟CPU有关的,
每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。

IA 架构的CPU(Intel的,AMD的CPU)中是Little-Endian,
而PowerPC 、SPARC和Motorola处理器是BIG-ENDIAN。

这其实就是所谓的主机字节序。

②网络字节序是指数据在网络上传输时是BIG-ENDIAN还是LITTLE-ENDIAN的,
tcp/ip协议中规定了,网络字节序是BIG-ENDIAN。
(感觉这个只是说,协议中那些Head部分的字符是用BIG-ENDIAN格式的,

对传递的数据应该无影响,这边发送,那边接受,

只要两边处理数据按同一顺序即可,网络传输不应该改变数据本身。)


③JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,

JAVA中默认是BIG-ENDIAN。

④C语言是受CPU影响的,我们通常是Intel和AMD的CPU,
所以C语言中实际就是Little-Endian的。

如果网络两端,一边是Java程序,一边是C程序,那么就要注意数据的字节顺序了。



3.在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,

而接收数据后,对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。

如果通信的一方是JAVA程序、一方是C/C++程序时, 则需要在C/C++一侧使用以上几个方法进行字节序的转换,

而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG- ENDIAN,

只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。

如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。


4.如果网络上全部是PowerPC,SPARC和Motorola CPU的主机那么不会出现任何问题,

但由于实际存在大量的IA架构的CPU,所以经常出现数据传输错误。

================================================================================
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved