Получить следующий IP из данной подсети [Python] - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы получить следующий IP из указанной подсети. Я знаю, как получить диапазон IP из нотации 192.168.0.1/24, но я не знаю, как получить следующий IP в пределах диапазона. Я написал этот код:

def get_next_ip(ip):
    tmp = ip.split('.')
    val = int(tmp[0]) << 24 + int(tmp[1]) << 16 + int(tmp[2]) << 8 + int(tmp[3])
    val = val + 1
    octet3 = val & 0xFF
    octet2 = (val >> 8) & 0xFF
    octet1 = (val >> 16) & 0xFF
    octet0 = (val >> 24) & 0xFF
    next_ip = str(octet0) + "." + str(octet1) + "." + str(octet2) + "." + str(octet3)
    return next_ip

И когда я запускаю print get_next_ip("192.168.0.1"), он печатает 0.0.0.1 вместо 192.168.0.2. Зачем?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ваш код не соответствует маске сети. На самом деле он даже не использует его. Вы разбираете на "." и не волнует "/24".

Все, что вам удалось сделать, - это анализ IP4-адреса, а затем добавление 1 к номеру, обеспечивающему переворачивание.

Если вы хотите следующий IP в этом случае следующий IP + 268

import ipaddress
ipaddress.ip_address('192.168.0.4') + 268
ip_str=str(ipaddress.ip_address('192.168.0.4') + 268

ip_str теперь должен быть '192.168.1.16'

0 голосов
/ 27 апреля 2018

Это из-за правил приоритизации.
Сдвиг битов влияет не только на каждую tmp [x], но и на целое значение перед оператором сдвига.
Сначала вы сдвигаете int (tmp [0]) на 24
Затем добавляет int (tmp [1])
Затем сдвигает общую сумму на 16
...

val = (int(tmp[0]) << 24) + (int(tmp[1]) << 16) + (int(tmp[2]) << 8) + int(tmp[3])  

сделает это.

...