主机字节序和网络字节序

现代cpu的累加器一次都能装载至少4个字节(32位),那么这四个字节在内存中的排列的排序将影响它被累加器装载成的整数的数值,这就是字节序问题。字节序分为大端字节序(big endian)和小端字节序(little endian),大端字节序是指低地址存高字节,高地址存放低字节。小端字节序则恰恰相反

判断机器字节序代码

#include <stdio.h>
void byteorder()
{
	union
	{
		short value;
		char union_bytes[sizeof(short)];
	}test;
	test.value=0x0102;
	if(test.union_bytes[0]==1 && test.union_bytes[2]==2)
	{
		printf("big endian\n");
	}
	else if(test.union_bytes[0]==2 && test.union_bytes[2]==1)
	{
		printf("lettle endian\n");
	}
	else
	{
		printf("unknown...\n");
	}
}

现代PC大多采用小端字节序,因此小端字节序又称主机字节序

当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之,解决问题的方法:发送端总是把要发送的数据转换成大端字节序后在再发送,而接收端知道对方传送过来的数据总是大端字节序,所以自身采用措施转换(小端机转换大端,大端则不用转换)
因此大端字节序也称网络字节序

Linux提供了4个函数来完成主机字节序和网络字节序之间的转换

#include <netinet.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

长整形函数通常用来转换IP地址
短整形通常用来转换端口号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值