小端逆序大端

39 篇文章 1 订阅
33 篇文章 1 订阅

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给逆置了

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值