华为机试——整数与IP地址间的转换

来源:互联网 发布:天敏网络机顶盒打不开 编辑:程序博客网 时间:2024/06/03 22:40

整数与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;}
0 0