整理了一下:
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,所以经常出现数据传输错误。
================================================================================
|