В случае, если вы не поняли из моих комментариев:
IP математика должна быть сделана в двоичной системе. IP-адреса и маски представляют собой целые числа без знака (32 бита для IPv4, 128 бит для IPv6). Все, что вам нужно знать, это адрес и маска, и вы можете понять все остальное.
Это алгоритм для того, что вы хотите выполнить, и он применим как к IPv4, так и к IPv6.
На основании вашего вопроса вам дается подсеть (вход 1) и последний адрес (вход 2).
- Вычесть целое число без знака входа 1 от целого числа без знака ввода 2. В результате обратная маска подсети. Обратная маска подсети должна быть
0
или маску подсети обратной плюс 1
должна быть сила 2
, иначе у Вас есть ошибка в одном из входов (СТОП ВХОД ERROR).
- Обратная маска
NOT
(результат этапа 1) представляет собой маску подсети.
- Если Input 1
AND
маска подсети не равно Input 1, у вас есть ошибка в одном из входов (STOP, ошибка ввода).
- Длина маски (номер CIDR) - это номер
1
бит в маске подсети . Есть несколько способов, чтобы вычислить количество 1
битов в виде двоичного числа, но если маска подсети является максимальным целым числом (или обратная маска 0
), то длина маски 32
(IPv4) или 128
(IPv6).Вы можете цикл, подсчет количества циклов и смещение маски подсети влево, пока она не равно 0
, петля подсчета количества циклов и смещение обратной маски к вправо, пока он не станет равным 0
затем добавляя 1
к общему и вычитания из общей 32
(IPv4) или 128
(IPv6), или вычесть показатель мощности 2
от общей обратной маски плюс 1
от 32
(IPv4) или 128
(IPv6).
- На данный момент у вас есть подтвержденный вход 1 (подсеть), вход 2 (последний адрес ) и рассчитанная длина маски (номер CIDR).
- Конечным результатом будет
<Input 1>/<Mask Length>
.
Ваш пример:
Шаг 1 (5.10.127.255 - 5.10.64.0 = 0.0.64.127
):
101000010100111111111111111 - 01000010100100000000000000 = 11111111111111
Шаг 2 (NOT 0.0.64.255 = 255.255.192.0
является степенью двух):
NOT 00000000000000000011111111111111 = 11111111111111111100000000000000
Шаг 3 (5.10.64.0 AND 255.255.192.0 = 5.10.64.0
):
01000010100100000000000000 AND 11111111111111111100000000000000 = 01000010100100000000000000
Шаг 4 (0.0.64.255 + 1 = 0.0.65.0 = 2^14, exponent of 2^14 = 14, 32 - 14 = 18
):
00000000000000000011111111111111 + 1 = 00000000000000000100000000000000 = 2^14, exponent of 2^14 = 14, 32 - 14 = 18
Шаг 5 (вход 1 = 5.10.64.0
, вход 2 = 5.10.127.255
, маска Длина = 18
)
Шаг 6 (Конечный результат = 5.10.64.0/18
)
Я думаю, что вы найдете информацию, которую вы ищете в этом посте: http://networkengineering.stackexchange.com/ Вопросы/3697/the-slash-after-an-ip-address-cidr-notation –
Реальный способ сделать это - «адрес и маска», чтобы получить адрес подсети и «подсеть + NOT маска», чтобы получить широковещательный адрес , И IP-адрес, и маска - это 32-разрядные целые числа без знака, и вам нужно использовать их для обработки IP-адресов. –
Если вы всегда уверены, что у вас будет первый (0) адрес и последний (широковещательный адрес), тогда вы можете получить однозначный ответ на это. Но если вы просто дадите ему произвольный диапазон, вы получите более одного ответа. – RealSkeptic