大小端与网络通讯
运行在同一台计算机上的进程相互通信时,一般不用考虑字节的顺序(字节序),字节序是一个处理器架构特性。
- 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
- 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
优缺点
大端模式优点:符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小
小端模式优点:
1. 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容(注解:比如把int的4字节强制转换成short的2字节时,就直接把int数据存储的前两个字节给short就行,因为其前两个字节刚好就是最低的两个字节,符合转换逻辑);
2. CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效
TCP/IP采用大端字节序
由于不同的处理器可以配置成大端或者小端,使得不同主机之间的通信变得复杂。
为此,网络协议指定了字节序。TCP/IP协议栈采用大端字节序,所以应用程序有时需要再处理器的字节序与网络的字节序之间进行转换。
对于TCP/IP应用程序,提供了以下四个通用函数进行转换:
#include <arpa/inet.h>
uint16_t ntohs(n) // 16位数据类型网络字节顺序到主机字节顺序的转换
uint16_t htons(n) // 16位数据类型主机字节顺序到网络字节顺序的转换
uint32_t ntohl(n) // 32位数据类型网络字节顺序到主机字节顺序的转换
uint32_t htonl(n) // 32位数据类型主机字节顺序到网络字节顺序的转换
如何判断本机是大小端
利用指针强制类型转换
#include<stdio.h>
int main()
{
int a = 1;
char * p = (char*)&a;
if (*p == 1)
{
printf("little-endian");
}
else
{
printf("big-endian");
}
return 0;
}
如果小端方式中(a占至少两个字节的长度)则a所分配的内存最小地址那个字节中就存着1,其他字节是0;大端的话则1在i的最高地址字节处存放。char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。
现状
Intel的80×86系列芯片使用小端存储模式
ARM芯片默认采用小端,但可以切换为大端
MIPS芯片采用大端,但可以在大小端之间切换
在网络上传输的数据普遍采用的都是大端
本文介绍了大小端字节序的概念及其优缺点,强调了在TCP/IP网络通讯中,协议采用大端字节序以确保不同处理器架构间的兼容性。通过特定函数进行字节序转换,并提供了一种判断本机字节序的方法。目前,常见的处理器如Intel和ARM在不同模式下分别支持小端和大端,而网络传输普遍遵循大端字节序。

592

被折叠的 条评论
为什么被折叠?



