ip地址与整数之间的转换

方法1:
  • IP地址转换为整数:IP地址每段可以堪称是8位无符号整数即0~255,把每段拆分成一个二进制形式,组合起来,然后把这个二进制数变啊层一个无符号32位整数。
  • 整数转换为IP地址:把这个整数转换成一个无符号32位二进制数。从左到右,每八位进行一下分割,得到4段8位的二进制数,把这些二进制数转换成整数然后加上“.”就可以了。
IP地址转换成二进制的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cassert>
using namespace std;

int *dec2bin(int decnum)
{
    int i,a,*b={0};
    a=decnum;
    for(i=7;i>=0;i--)
    {
        b[i]=a%2;
        a=a/2;
    }
    return b;   
}

int ipToInt(char *ipString)
{
    assert(ipString!=NULL);
    int i=0,j,n,l,count=0,return_num=0;
    char *tmp;
    int *tmp_num,*num,*d2b;
    char *s=ipString,*s_tmp;
    
    if(*s=='.')
          count++;
    count++;
    if(count!=4)
         return 0;
    
    while(*s!='\0')
    {
        if(*s!='.')
        {
             n=s-s_tmp;
             tmp=(char*)malloc(n*sizeof(char));
             memcpy(tmp,s,n);
             tmp_num[i]=atoi(tmp);
             d2b=dec2bin(tmp_num[i]);
             for(j=0;j<8;j++)
                num[8*i+j]=d2b[j];
             s++;
             i++;
             s_tmp=s;
        }
        s++;
    }
    if(*s='\0')
    {
        n=s-s_tmp;
        tmp=(char*)malloc(n*sizeof(char));
        memcpy(tmp,s,n);
        tmp_num[i]=atoi(tmp);
        d2b=dec2bin(tmp_num[i]);
        for(j=0;j<8;j++)
        num[8*i+j]=d2b[j];
    }
    for(j=0;j<32;j++)
       return_num=return_num*2+num[j];
    
    return return_num;
}

int main(void)
{
    char *string;
    string="192.168.12.56";
    cout<<string;
    int num,i;
    num=ipToInt(string);
    printf("The result is:");
    //for(i=0;i<32;i++)
      //  printf("%d",num[i]);
    cout<<num;
    system("pause");
    return 0;
    
}

方法2:C++中IP地址的转换及判断(转自:http://blog.chinaunix.net/uid-439869-id-2403088.html)
1)IP地址,是由网络地址的部分加上主机地址的部分组成的。例如:
   172.24.12.61(A/28)
  这个描述方式表示了这个IP地址所属的网络是一个28位掩码的网络。所谓网络掩码,是一个连1+连0组成的IP地址类型的地址,一个掩码的末尾有多少位连续的0(e.g. x个),就表示这个子网可以有2^x个主机地址。IP地址最长也只有32位,所以A/28就表示前面28位都是1,那么最后就有4个0,所以这个网络的掩码就是255.255.255.240.(240=0xF0)
    那么上面那个IP地址的子网地址是怎么得出来的呢?就是用IP地址和子网掩码做一下“与”运算,即:
    172.24.12.61&255.255.255.240=172.24.12.48
    可见,这个子网的网络地址就是172.24.12.48,那么172.24.12.61的主机地址就是13.
    补充一下,所谓“与”运算,其实是把十进制的数字换算成二进制以后的“与”。
    一个子网里,子网网络地址通常是不分配给主机用的,而且,子网的广播地址也是不分配的。子网的广播地址指的就是子网网络地址的后面那几个0的作为主机地址的值都是1的IP地址。那么在这个例子里,子网广播地址就是:172.24.12.63。
    要判断两个IP地址是否属于同一子网,可以把两个IP地址分别与他们的子网掩码“与”一下,如果得到同一个子网地址,那就属于同一子网的了。
2)在C++中,要把一个IP地址的字符串转换成一个可以直接用来做“与”运算的数字,可以用这个函数。
inet_addr()将网络地址转换成二进制的数字
相关函数 inet_aton, inet_ntoa
表头文件
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定义函数 unsigned long int inet_addr(const char *cp);
函数说明 inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串。
返回值:成功则返回对应的网络二进制的数字。失败返回-1.
3)C++中,反过来,如果要把一个这种运算完成的二进制数字直接生成一个IP地址的字符串的话,可以用下面这个函数。
inet_ntoa()将网络二进制的数字转换成网络地址
相关函数 inet_addr,inet_aton
表头文件
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定义函数 char * inet_ntoa(struct in_addr_in);
函数说明 inet_ntoa()用来将参数in所指的网络二进制数字转换成网络地址,然后将指向此网络地址字符串的指针返回。
返回值:成功则返回字符串指针,失败则返回NULL。
结构in_addr定义如下
struct in_addr
{
     unsigned long int s_addr;
}
4)代码例子:
   unsigned long int ip=inet_addr(ipString.c_str());
   in_addr subnetIp;
   subnetIp.s_addr=ip &Mask;
   subnetIpAddr=inet_ntoa(subnetIp);
5)说明:
    需要注意的是,在使用以上两个函数的时候,要在引用的头文件里加上上面所提到的三个头文件:
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
    此外,在编译的时候,还需要在makefile里加上两个链接库问价(nsl和socket)。否则的话会出现ld的错误。

转载处链接:
http://blog.sina.com.cn/s/blog_7124c26901014ncv.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值