IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
1.字符型IP地址转换为整型。即给定一个IP地址将其转换成32的无符号整数。例如:192.168.0.1 对应的32位二进制表示为:11000000101010000000000000000001。将这个32位2进制转换为整数为:3232235521.
2.整数转换为字符型IP地址。例如:给一个整型3232235521,其对应的32位二进制为:11000000101010000000000000000001。将这个2进制分成4组,每组8位,然后变成IP地址为192.168.0.1.
变成主要涉及:移位操作、字符型转换为整型、整型转换为字符型。
(1)位操作
int a=b<<n; //b向左移n位,并把结果赋值给a ;int a=b>>n; //b向右移n位,并把结果赋值给a ; int a=15; int b=2; int c=a&b; //a与b按位与运算,把结果赋值给c
位逻辑运算符:&(位“与”)、^(位“异或”)、|(位“或”)和~(位“取反”)
移位运算符:<<(左移)和>>(右移).
(2)字符型转换为整型
num=atoi(str[i].c_str());
(3)整型转换为字符型
int n;
string s;
stringstream ss;
ss<<n;
ss>>s;
代码
// test.cpp : 定义控制台应用程序的入口点。
//主要实现:1.字符型IP地址转换为整型;2.整型转换为字符型IP地址
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<sstream>
#include<string>
using namespace std;
//字符IP地址转换为整型
unsigned int IPtoInt(string& s)
{
string str[4];
int start=0,n=0;
unsigned int num;
unsigned int a=0;
unsigned int sum=0;
for(int i=0;i<4;i++)
{
start=s.find('.',n);
if(start==-1)
start=s.size();
str[i]=s.substr(n,start-n);
n=start+1;
num=atoi(str[i].c_str());
a=num<<8*(3-i);
sum+=a;
}
return sum;
}
//整型数转换为字符型的IP地址
string InttoIP(unsigned int n)
{
unsigned int num;
unsigned int m=255;
string str="",s;
for(int i=0;i<4;i++)
{
stringstream ss; //注意此处的声明不能在for循环外面,否则转换为s的字符串始终为第一次的值
num=n&m;
m=m<<8;
num=num>>8*i;
ss<<num;
ss>>s;
if(i!=3)
{
s="."+s;
str=s+str;
}
else
str=s+str;
}
return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
string s="192.168.0.1";
unsigned int number;
number=IPtoInt(s);
cout<<number<<endl;
unsigned int n=3232235521;
string str;
str=InttoIP(n);
cout<<str<<endl;
return 0;
}