大小端的问题的话语场景:代码移植和网络通信

只知道大小端是什么意思,而不知道大小端的应用场景,显然对这个东东是不可能有深刻理解的。

(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

大小端的问题的话语场景:代码移植和网络通信_第1张图片

(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)关于浮点数转换为网络字节序的问题

你可能感兴趣的:(C语言,网络通信,Socket,HTTPP)