主机字节序
在不同的CPU处理器下,有不同的字节序类型,而字节序是指整数在内存中存储的顺序叫做主机序。最常见的主机序有两种:
大端存储(Big endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处。(最直观的字节序,即数据位从左到右的顺序按照从低到高顺序写出即为内存地址。
小端存储(Little endian):最高有效位存于最高内存地址处,最低有效位存于最低内存处。(符合人思维的字节序低地址存低位)
如何确定自己的主机是大端序还是小端序
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
union
{
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if ( sizeof(short) == 2 )
{
if (un.c[0] == 1 && un.c[1] == 2)
printf("Big-Endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("Little-Endian\n");
else
printf("Unknown\n");
}
else
printf("sizeof(short) = %ld\n", sizeof(short));
exit(0);
}
网络字节序
网络字节序是TCP/IP中规定好的一种数据表示格式,他与CPU类型,操作系统无关,是可以保证数据在不同主机之间传输能够被正确解释的一种标准,网络字节序是采用大端存储(Big endian)。
为了实现两个存储方式不同的主机在传输时,需要借助字节序转换函数。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(){
unsigned short host_port = 0x1234, net_port;
unsigned long host_addr = 0x12345678, net_addr;
net_port = htons(host_port);
net_addr = htonl(host_addr);
printf("Host ordered port: %#x\n", host_port);
printf("Network ordered port: %#x\n", net_port);
printf("Host ordered address: %#lx\n", host_addr);
printf("Network ordered address: %#lx\n", net_addr);
return 0;
}
标签:addr,主机,函数,host,printf,net,port,字节 From: https://www.cnblogs.com/any11yan/p/16771476.html