1. 程式人生 > >十進位制點分IP轉換為32位二進位制IP

十進位制點分IP轉換為32位二進位制IP

寫這篇部落格的緣由在於自己在判斷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 */