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

本文解释了大小端模式的概念,包括它们为何存在、如何定义及在计算机体系结构中的应用。此外,还介绍了不同计算机体系间通信时如何确保数据被正确解读,并提供了TCP/IP协议中网络字节顺序的相关函数。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值