只知道大小端是什么意思,而不知道大小端的应用场景,显然对这个东东是不可能有深刻理解的。
(1)为什么出现这个东西?
答:在各种计算机体系结构中,对于字节、字等的存储机制有所不同。
(2)何谓大端,何谓小端?
答:这个有点绕。简单的:if(0x12345678 & 0xFF == 0x12) Byte Endian,即高位的数据放在低位的地址处。小端反之
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
(3)不同计算机体系之间的通信,数据对方能否正确理解?
答:需要双方约定,或者有规范来遵守。因为遵守TCP传输规范,可以保持通信双方开发的独立,而不必要和对方约定什么字节序的问题。双方只在通信的线路上保持数据的准确就可以了。在通信的发起方:使用htons(windows和linux下都有这个函数)就可以转化好了,当然如果本来的机器存储就是大端的就不转换了。
在通信的接收方:依据接收时数据是大端,和自己的计算机体系来决定怎么保存这个数据。
(4) TCP/IP 协议规范?
在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式) 。
(5)相关的函数
* unsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
* unsigned long int htonl(unsigned long int hostlong):
主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes
* unsigned short int ntohs(unsigned short int netshort):
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
* unsigned long int ntohl(unsigned long int netlong):
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes
注:以上函数原型定义在netinet/in.h里
(6)关于浮点数转换为网络字节序的问题