Преобразовать строку IP-адреса в двоичный файл в Python - PullRequest
8 голосов
/ 29 апреля 2010

В рамках более крупного приложения я пытаюсь преобразовать IP-адрес в двоичный. Цель состоит в том, чтобы позже вычислить широковещательный адрес для пробуждения по трафику локальной сети. Я предполагаю, что есть гораздо более эффективный способ сделать это, чем я думаю. Это разбивает IP-адрес на октет, добавляя 0 к началу каждого октета, где это необходимо, преобразовывая каждый октет в двоичный файл, а затем объединяя результаты. Должен ли я смотреть на netaddr, сокеты или что-то совершенно другое?

Пример: с 192.168.1.1 по 11000000.10101000.00000001.00000001

Ответы [ 6 ]

7 голосов
/ 29 апреля 2010

Вы думаете о чем-то вроде ниже?

ip = '192.168.1.1'
print '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')])

Я согласен с другими, вам, вероятно, следует избегать преобразования в двоичное представление для достижения того, что вы хотите.

7 голосов
/ 29 апреля 2010

Является ли сокет . inet_aton() тем, что вы хотите?

3 голосов
/ 29 апреля 2010

Цель состоит в том, чтобы позже вычислить широковещательный адрес для пробуждения по трафику локальной сети

ipaddr (см. PEP 3144 ):

import ipaddr

print ipaddr.IPNetwork('192.168.1.1/24').broadcast
# -> 192.168.1.255

В Python 3.3, ipaddress, модуль :

#!/usr/bin/env python3
import ipaddress

print(ipaddress.IPv4Network('192.162.1.1/24', strict=False).broadcast_address)
# -> 192.168.1.255

Чтобы точно соответствовать примеру в вашем вопросе:

# convert ip string to a binary number
print(bin(int(ipaddress.IPv4Address('192.168.1.1'))))
# -> 0b11000000101010000000000100000001
2 голосов
/ 06 апреля 2016

Вы можете использовать функцию строкового формата для преобразования чисел в двоичные. Я сделал эту функцию:

def ip2bin(ip):
    octets = map(int, ip.split('/')[0].split('.')) # '1.2.3.4'=>[1, 2, 3, 4]
    binary = '{0:08b}{1:08b}{2:08b}{3:08b}'.format(*octets)
    range = int(ip.split('/')[1]) if '/' in ip else None
    return binary[:range] if range else binary

Это вернет двоичный диапазон IP или IP, поэтому вы можете использовать его для проверки, находится ли IP в диапазоне:

>>> ip2bin('255.255.127.0')
'11111111111111110111111100000000'
>>> ip2bin('255.255.127.0/24')
'111111111111111101111111'
>>> ip2bin('255.255.127.123').startswith(ip2bin('255.255.127.0/24'))
True
1 голос
/ 21 декабря 2017

Определить IP-адрес в переменной

ipadd = "10.10.20.20"

конвертировать IP-адрес в список

ip = ipadd.split(".")

Теперь конвертируем IP-адрес в двоичные числа

print ('{0:08b}.{1:08b}.{2:08b}. 
    {3:08b}'.format(int(ip[0]),int(ip[1]),int(ip[2]),int(ip[3])))

00001010.00001010.00010100.00010100
0 голосов
/ 29 января 2019
IP = '192.168.1.1'

ip2bin =  ".".join(map(str,["{0:08b}".format(int(x)) for x in IP.split(".")]))
print(ip2bin)

выход

11000000.10101000.00000001.00000001
...