华为机试——整数与IP地址间的转换
2016-01-09 14:37
316 查看
整数与IP地址间的转换
原理:IP地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个IP地址为10.0.3.193
每段数字转换成相应的二进制数
10 00001010
0 00000000
3 00000011
193 1100001
组合起来即为:00001010000000000000001111000001转换成10进制数就是167773121,即该IP地址转换后的数字就是它了。
每段可以看成是一个0-255的整数,需要对IP地址进行检验。
原理:IP地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个IP地址为10.0.3.193
每段数字转换成相应的二进制数
10 00001010
0 00000000
3 00000011
193 1100001
组合起来即为:00001010000000000000001111000001转换成10进制数就是167773121,即该IP地址转换后的数字就是它了。
每段可以看成是一个0-255的整数,需要对IP地址进行检验。
#include<iostream> #include<string> #include<cctype> #include<cstdlib> using namespace std; string Int2Bit(string str) //将十进制数转换为二进制 { int num=atoi(str.c_str()); string tmp; char tmp1[10]={0}; itoa(num,tmp1,2);//10转换的结果为1010 tmp=string(tmp1); if(tmp.size()<8) { string tmp2(8-tmp.size(),'0'); str=tmp2+tmp;//在前面补零 } else str=tmp; //cout<<str<<endl; return str; } unsigned int Bit2Dec(string str)//二进制转换为十进制 { unsigned int result=0; string::size_type i=0; while(i<str.size()) result=(result<<1)+(str[i++]-'0');//一定要加括号,<<的运算级别低于+ return result; } unsigned int IpToInt(string ip) { string str[4],BitIP; int k=0,flag=0; string::size_type i=0; while(i<ip.size()) { int tmp=i; while(isdigit(ip[tmp])) tmp++; str[k]=ip.substr(i,tmp-i); k++; i=tmp+1; } for(int i=0;i<4;i++) if(atoi(str[i].c_str())>=0 && atoi(str[i].c_str())<256) flag++; if(flag==4) { for(int i=0;i<4;i++) { string temp=Int2Bit(str[i]); BitIP+=temp; //cout<<BitIP<<endl; } } else return -1; return Bit2Dec(BitIP); } void Int2IP(unsigned int n) { string s,tmp; int a,b,c,d; char Bits[33]={0};//数组大小应大于32位,还包含‘\0’,否则会出错 itoa(n,Bits,2); //十进制转换成二进制 tmp=string(Bits); if(tmp.size()<32) { string tmp2(32-tmp.size(),'0');//前面补零 s=tmp2+tmp; } else s=tmp; a=Bit2Dec(s.substr(0,8)); b=Bit2Dec(s.substr(8,8)); c=Bit2Dec(s.substr(16,8)); d=Bit2Dec(s.substr(24,8)); cout<<a<<'.'<<b<<'.'<<c<<'.'<<d<<endl; } int main() { string ip; unsigned int num; cin>>ip; num=IpToInt(ip); cout<<num<<endl; Int2IP(num); return 0; }
相关文章推荐
- Ubuntu挂载共享文件和虚拟硬盘
- oschina 建站系统
- XHttpPost 请求与连接超时回调
- ListView 如何判断ListView是否可以滑动(即ListView的Item总数是否超过可视区域)
- 重拾编程之路--leetcode(java)--删除(覆盖)指定数组元素,输出新长度
- 浅析Hibernate
- 前端面试题目搜集——理论知识
- ios 通知
- 数据字典项 设计实现方案
- 使用jqueryui
- Linux 分布式复制块设备之DRBD
- linux ssh 免密码登录
- 算法洗脑系列(8篇)——第五篇 分治思想
- 华为机试——单词倒排
- 常见分布式计算框架特点
- 用户邮箱进行注册思路
- Nginx简介
- ldr与adr的区别
- Nginx+php-fpm 502 504问题
- vim配置