2010-04-28 20 views
7

Jako część większej aplikacji staram się przekonwertować adres IP na binarny. Celem jest późniejsze obliczenie adresu rozgłoszeniowego dla ruchu Wake on LAN. Zakładam, że istnieje o wiele bardziej skuteczny sposób, aby to zrobić, niż w sposób, w jaki myślę. Rozbijając adres IP oktet, dodając 0 na początku każdego oktetu w razie potrzeby, konwertując każdy oktet na binarny, a następnie łącząc wyniki. Czy powinienem patrzeć na netaddr, gniazda, czy coś zupełnie innego?Konwertuj ciąg adresu IP na binarny w języku Python

Przykład: Od 192.168.1.1 do 11000000.10101000.00000001.00000001

+0

Szukasz przekonwertować adres IPv4 do jej reprezentacji liczb całkowitych? Lub jaką reprezentację binarną próbujesz przekonwertować? – Nate

+1

Przykład: Od 192.168.1.1 do 11000000.10101000.00000001.00000001 – pizzim13

+0

Jest to niezwykle nietypowy sposób wyrażania ipaddresses. Nie sądzę, że istnieje jakiś moduł do produkcji lub konsumpcji tego formatu. –

Odpowiedz

4

Myślisz o czymś takim jak poniżej?

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

zgadzam się z innymi, to prawdopodobnie należy unikać przekonwertować do reprezentacji binarnej, aby osiągnąć to, co chcesz.

+0

Tego właśnie szukałem, ale Nie do końca rozumiem, jak to działa. Rozumiem, że dzielisz adres IP przez ".", A następnie łączę wyniki przez. '."i konwersję z liczby całkowitej na binarną, ale to:" (x) +256) [3:] dla x w ", całkowicie utracone. Czy możesz wskazać właściwy kierunek, aby sprawdzić, co robisz? – pizzim13

+0

@ pizzim13: bez magii. Dobrze rozumiesz, jak to działa. +256 jest tam, aby zawsze mieć 9-bitową liczbę binarną, wtedy łatwo jest usunąć 0b1 z przodu numeru. – kriss

+0

@ pizzim13: i dla '[... dla x w ...]' zobacz część z ** zrozumieniem listy ** w dokumentacji Pythona. – kriss

7

Czy socket. inet_aton() czego chcesz?

+3

Wydaje się działać: 'bin (struct.unpack ('! I', socket.inet_aton ('192.168.1.1')) [0])' -> ''0b11000000101010000000000100000001''' – jfs

3

celem jest, aby później obliczyć adres rozgłoszeniowy dla Wake on ruch LAN

ipaddr (patrz PEP 3144):

import ipaddr 

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

W Pythonie 3.3, ipaddress module:

#!/usr/bin/env python3 
import ipaddress 

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

Aby dopasować się do egzaminu e w swoim pytaniu dokładnie:

# convert ip string to a binary number 
print(bin(int(ipaddress.IPv4Address('192.168.1.1')))) 
# -> 0b11000000101010000000000100000001 
1

Możesz użyć funkcji formatu smyczkowego do konwersji liczb na binarne. Zrobiłem tę funkcję:

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 

ten powróci binarny IP lub zakres adresów IP, więc można go używać do testowania, jeśli IP jest w zakresie:

>>> 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

Definiowanie adresu IP w zmiennej

ipadd = "10.10.20.20" 

konwersji adresu IP na liście

ip = ipadd.split(".") 

Teraz przekonwertować adres IP w liczbach binarnych

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 
Powiązane problemy