IP地址转换-16进制转化为10进制

很久之前写的,今天放在这里。

1、不含字母

#include <iostream>
#include <stdio.h>

//8个二进制(2个十六进制)数转换成十进制数,不含a-f。即00-99的转换
int transfer_0(int x)
{
	int y;//结果
	int temp;//临时值

	y=x%10;//个位数
	temp=(x%100-y)/10;//十位数
	y+=temp*16;
	return y;
}

//32个二进制(4个十六进制)数转换成十进制数,不含a-f。即0000-9999的转换
void transfer_1(unsigned int x)
{
	//从右向左
	int temp1=x%100;
	int y1=transfer_0(temp1);

	int temp2=(x%10000-temp1)/100;
	int y2=transfer_0(temp2);

	int temp3=(x%1000000-temp1-temp2*100)/10000;
	int y3=transfer_0(temp3);

	int temp4=(x%100000000-temp1-temp2*100-temp3*10000)/1000000;
	int y4=transfer_0(temp4);

	printf("结果是:%d.%d.%d.%d\n",y4,y3,y2,y1);
}

void main()
{
	unsigned int x;
	printf("IP地址:");
	scanf("%d",&x);
	transfer_1(x);
	system("pause");
}

2、含有字母

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

//将16进制数数转化成10进制数,一位的0-F。
int transfer_0(char x)
{
	int y=0;//返回值
	if (x>='0' && x<='9')//0-9的数字
	{
		y=x-'0';
		return y;
	}
	if (x>='a' && x<='f')//a-f的字母
	{
		y=x-'a'+10;
		return y;
	}
	if (x>='A' && x<='F')//A-F的字母
	{
		y=x-'A'+10;
		return y;
	}
	printf("参数错误!");
	exit(1);
}

/*
//将16进制数数转化成10进制数,两位的00-FF。
int transfer_1(char x[],int n)//长度为2
{
	char s[2];//固定的,长度不变
	for (int i=0;i<n;i++)
	{
		s[i]=x[i];
	}

	int y1=transfer_0(s[0]);//十位
	int y2=transfer_0(s[1]);//个位
	int y=y2+y1*16;
	return y;	
}
*/

//尝试一次,尝试删除上面的,哈哈~~
//将16进制数数转化成10进制数,八位的00000000-FFFFFFFF。
void transfer_2(char x[],int n)//长度为8
{
	//从左往右
	int y0=transfer_0(x[0]);
	int y1=transfer_0(x[1]);
	int y2=transfer_0(x[2]);
	int y3=transfer_0(x[3]);
	int y4=transfer_0(x[4]);
	int y5=transfer_0(x[5]);
	int y6=transfer_0(x[6]);
	int y7=transfer_0(x[7]);

	printf("结果是:%d.%d.%d.%d\n",y0*16+y1,y2*16+y3,y4*16+y5,y6*16+y7);	
}

void main()
{
	char x[9]="";	
	printf("8位的IP地址(十六进制):");//不能有空位
	cin>>x;
	transfer_2(x,8);
	system("pause");
}

3、提交版

#include <stdio.h>
#include <string>

//将16进制数数转化成10进制数,一位的0-F。
int transfer_0(char x)
{
	int y=0;//返回值
	if (x>='0' && x<='9')//0-9的数字
	{
		y=x-'0';
		return y;
	}
	if (x>='a' && x<='f')//a-f的字母
	{
		y=x-'a'+10;
		return y;
	}
	if (x>='A' && x<='F')//A-F的字母
	{
		y=x-'A'+10;
		return y;
	}
	printf("参数错误!");
	exit(1);
}

//将16进制数数转化成10进制数,八位的00000000-FFFFFFFF。
void transfer_2(char x[])
{
	//从左往右
	int y1=transfer_0(x[0])*16+transfer_0(x[1]);
	int y2=transfer_0(x[2])*16+transfer_0(x[3]);
	int y3=transfer_0(x[4])*16+transfer_0(x[5]);
	int y4=transfer_0(x[6])*16+transfer_0(x[7]);

	printf("结果是:%d.%d.%d.%d\n",y1,y2,y3,y4);	
}

void main()
{
	char x[9]="";//长度为8	
	printf("8位的IP地址(十六进制):");//不能有空位,只取前8位
	scanf("%s",&x);
	transfer_2(x);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值