IPv4地址转换成整数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <cmath>
using namespace std;

bool isnumber(const string &num) {
for (char ch : num) {
if (!isdigit(ch)) {
return false;
}
}
return true;
}

int main() {

std::string input;
getline(cin, input);

istringstream iss(input);
std::vector<string> numbers;
std::string section;
while (getline(iss, section, '#')) {
numbers.push_back(section);
}

// 开始检查 IPV4 地址的合法性

//1-判断元素个数为 4
if (numbers.size() != 4) {
cout << "invalid IP" << endl;
return 0;
}
//2-1判断元素全部为数字
//2-2判断元素第一个不是以 0 开头
for (const auto &number : numbers) {
if (number.empty() || !isnumber(number)) {
cout << "invalid IP" << endl;
return 0;
}
if (number.size() > 1 && number[0] == '0') {
cout << "invalid IP" << endl;
return 0;
}
}

//4-判断元素在合理范围
auto num_temp = stoi(numbers[0]);
if (num_temp < 0 || num_temp > 128) {
cout << "invalid IP" << endl;
return 0;
}
for (int i = 1; i < 4; ++i) {
num_temp = stoi(numbers[i]);
if (num_temp < 0 || num_temp > 255) {
cout << "invalid IP" << endl;
return 0;
}
}

//合法之后,开始计算
long long result;
result = stoi(numbers[0])*pow(2, 24)
+ stoi(numbers[1])*pow(2, 16)
+ stoi(numbers[2])*pow(2, 8)
+ stoi(numbers[3])*pow(2, 0);

cout << result << endl;

return 0;
}

这道题主要是先排除各种特殊情况,这些特殊情况意味着 IPV4 地址的不规范。拿到合法的 IPV4 之后,计算整数即可。

那么如何把 IPV4 地址 转换为 整数?

分解每个部分:虚拟IPv4地址由四个部分组成,例如 128#0#255#255。我们将其表示为 A.B.C.D,其中 A、B、C 和 D 分别是四个部分。

转换为整数:将每个部分当作一个字节(0~255),然后将其合并为一个32位整数。合并的过程是按从左到右的顺序进行,每个部分的值会根据其位置乘以对应的位移量。具体的位移量如下:

  • A 乘以 2^24(即 16777216)
  • B 乘以 2^16(即 65536)
  • C 乘以 2^8(即 256)
  • D 不需要位移

所以,转换公式为:32位整数 = A * 2^24 + B * 2^16 + C * 2^8 + D