十進位制點分IP轉換為32位二進位制IP
阿新 • • 發佈:2019-01-27
寫這篇部落格的緣由在於自己在判斷IP地址的合法性上吃了幾次考慮不周全的虧。
算是引以為戒吧。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool change2Binary(const string &str) {
/* 判斷IP地址的合法性1
1. 有不合法字元
2. 點號數量不等於3
3. 點號在頭尾,或者點號相鄰。
*/
string judge = ".0123456789" ;
int cnt = 0;
int dots[3] = {0};
for(unsigned i = 0; i < str.size(); ++i) {
if(str[i] == '.') {
if(cnt >= 3) return false;
dots[cnt++] = i;
}
if(judge.find(str[i]) == -1) return false;
}
if(cnt != 3 || str[0] == '.' || str[str.size() - 1 ] == '.'
|| dots[1] - dots[0] < 2 || dots[2] - dots[1] < 2)
return false;
/* 將IP地址由 . 分隔的四個欄位存入四個int變數中。 */
int arrInt[4] = { 0 };
unsigned k = 0;
for (int i = 0; i < 4; ++i) {
while (str[k] != '.' && k < str.size()) {
arrInt[i] = arrInt[i] * 10 + str[k++] - '0';
}
++k;
}
/* 判斷IP地址的合法性2 */
for (int i : arrInt) {
if (i < 0 || i > 255) return false;
}
/* 將十進位制數轉換成二進位制數輸出 */
for (int i = 0; i < 4; ++i) {
int tmp = arrInt[i];
vector<int> vecBin(8, 0);
for (unsigned j = 0; tmp != 0; ++j) {
vecBin[j] = tmp % 2;
tmp /= 2;
}
for (auto iter = vecBin.crbegin(); iter != vecBin.crend(); ++iter)
cout << *iter;
}
return true;
}
int main(void) {
string str;
cin >> str;
if (!change2Binary(str))
cout << "data error" << endl;
return 0;
}
/* 測試資料
.12.12.12
0.1.1.1.
1..2.2234
sd.12j12lj
11001010100101110110000000100001
11001010100101110110000000100001
*/