整数与IP地址间的转换
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
的每段可以看成是一个0-255的整数,需要对IP地址进行校验
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 using namespace std; 5 6 long tolong(string IP) 7 { 8 vector<long>vec; 9 for (int i = 0; i<IP.size(); i++) 10 { 11 int begin = i; 12 int end = i; 13 while (IP[end] != '.'&&IP[end] != '\0') 14 { 15 end++; 16 } 17 i = end; 18 19 string sbstr = IP.substr(begin, end - begin); 20 vec.push_back(atoi(sbstr.c_str())); 21 } 22 long num = 0; 23 for (int i = 0; i < vec.size(); i++) 24 { 25 vec[i] = vec[i] << ((3 - i) * 8); 26 num += vec[i]; 27 } 28 return num; 29 } 30 string tostr(long num) 31 { 32 string str; 33 if (num == 0) 34 str += '0'; 35 while (num) 36 { 37 int n = num % 10; 38 str.insert(str.begin(), n + '0'); 39 num = num / 10; 40 } 41 return str; 42 } 43 string toIP(long num) 44 { 45 vector<long> vec; 46 for (int i = 0; i < 4; i++) 47 { 48 long mask = 0x000000ff; 49 long m = num >> ((3 - i) * 8); 50 vec.push_back(m&mask); 51 } 52 string str; 53 str += tostr(vec[0]); 54 for (int i = 1; i < vec.size(); i++) 55 { 56 str += '.' + tostr(vec[i]); 57 } 58 return str; 59 } 60 61 int main() 62 { 63 string IP; 64 long num; 65 while(cin>>IP &&cin>>num) 66 { 67 long ipnum=tolong(IP); 68 string str=toIP(num); 69 cout<<ipnum<<endl; 70 cout<<str<<endl; 71 } 72 return 0; 73 } 74 添加笔记