http://blog.sina.com.cn/s/blog_7124c26901014ncv.html 2013
方法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./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.
那么上面那个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的错误。
|