c语言编码,实现函数long htonl(long a),也就是将主机序转化为网络序
网络序统一为大端。该算法主要需要测试主机序,
如果是大端则不做任何的改变,如果是小端则逆序
首先,请看代码;
#include<stdio.h>
#include<stdlib.h>
int htonl_small()
{
int a = 1;
return *((char*)&a);
}
long htonl(long a)
{
long b = 0;
int i = 0;
if (!htonl_small())//判断主机是否为小端
{
return a;
}
for(i=0;i<sizeof(a);i++)//如果是小端就逆序
{
b = ((b << 8) | (a & 0xff));
a = a>>8;
}
return b;
}
int main()
{
long a = 0x12345678;
printf("%x\n" ,htonl(a));
system("pause");
return 0;
}
解释:首先我们定义long类型的a = 0X12345678(0x是16进制前缀,计算机存储的也是十六进制);如果是小端存储的话因该是这样的—87 65 43 21 如果是大端存储的话是这样的——12 34 56 78 ;然而网络都是大端,所以小端机器在与网络交互时,需要将小端转化为大端;
下来主要解释几条代码
1:htonl_small函数,判断机器是否为小端,在函数里面我们定义了int型的a并初始化其为1,如果a是小端存储其存储的是-01 00 00 00 如果是大端为-00 00 00 01 ,然后我们使用*((char*)&a) 将a的地址转化为char类型(char类型只有两字节),那么如果是小端存储返回的就是01 ,如果是大端返回的是00;
2:b = ((b << 8) | (a & 0xff));
a = a>>8; 这段代码请看下面图做解释
循环之后的结果是b=0x78563412将其存储在小端中就是0x12345678;这样就把a在小端中存储的0x78563412给逆置了