2010-02-04 9 views

Odpowiedz

27

sieciowy jest zapewniony przez moduł gniazda.

socket.inet_ntoa(packed_ip)

Konwersja 32-bitowy adres IPv4 suchy (ciąg czterech znaków) do jego postaci standardowego-quad łańcucha znaków (na przykład „123.45.67.89”). Jest to przydatne podczas konwersacji z programem, który używa standardowej biblioteki C i potrzebuje obiektów typu struct in_addr, który jest typem C dla 32-bitowych spakowanych danych binarnych, które funkcja przyjmuje jako argument.

można przetłumaczyć hex ciąg packed ip korzystając struct.pack() i mały endian, unsigned long format.

>>> import socket 
>>> import struct 
>>> addr_long = int("0200A8C0",16) 
>>> hex(addr_long) 
'0x200a8c0' 
>>> struct.pack("<L", addr_long) 
'\xc0\xa8\x00\x02' 

>>> socket.inet_ntoa(struct.pack("<L", addr_long)) 
'192.168.0.2' 
>>> 
+1

Najbardziej przydatna odpowiedź, IMO. –

+1

Chcesz " Omnifarious

+0

@Owspółmiernie, jak dokładnie to "długie/int" ma wpływ na to tutaj? –

2

Można zrobić coś takiego:

>>> s = '0200A8C0' 
>>> octets = [s[i:i+2] for i in range(0, len(s), 2)] 
>>> ip = [int(i, 16) for i in reversed(octets)] 
>>> ip_formatted = '.'.join(str(i) for i in ip) 
>>> print ip_formatted 
192.168.0.2 

Podział oktet może być zrobione prawdopodobnie bardziej elegancko, ale nie mogę myśleć o prostszy sposób z góry na głowie.

EDIT: lub w jednym wierszu:

>>> s = '0200A8C0' 
>>> print '.'.join(str(int(i, 16)) for i in reversed([s[i:i+2] for i in range(0, len(s), 2)])) 
192.168.0.2 
+0

tak teh zgrupowanie w szczególności dostaje się do mnie. nie mogę znaleźć fajnego sposobu na "oderwanie" oktetów i iterować je w odwrotnej kolejności, mam nadzieję, że ktoś zna sposób. –

+0

@Max, odpowiedź Rogera zawiera bardzo intrygujący sposób na zrobienie tego. –

4
>>> s = "0200A8C0" 
>>> bytes = ["".join(x) for x in zip(*[iter(s)]*2)] 
>>> bytes 
['02', '00', 'A8', 'C0'] 
>>> bytes = [int(x, 16) for x in bytes] 
>>> bytes 
[2, 0, 168, 192] 
>>> print ".".join(str(x) for x in reversed(bytes)) 
192.168.0.2 

To jest krótki i jasny; zapakuj go w funkcję z funkcją sprawdzania błędów do własnych potrzeb.


przydatnych funkcji grupowania: manipulacja adres

def group(iterable, n=2, missing=None, longest=True): 
    """Group from a single iterable into groups of n. 

    Derived from http://bugs.python.org/issue1643 
    """ 
    if n < 1: 
    raise ValueError("invalid n") 
    args = (iter(iterable),) * n 
    if longest: 
    return itertools.izip_longest(*args, fillvalue=missing) 
    else: 
    return itertools.izip(*args) 

def group_some(iterable, n=2): 
    """Group from a single iterable into groups of at most n.""" 
    if n < 1: 
    raise ValueError("invalid n") 
    iterable = iter(iterable) 
    while True: 
    L = list(itertools.islice(iterable, n)) 
    if L: 
     yield L 
    else: 
     break 
+0

@Roger, jak działa 'zip (* [iter (s)] 2)'? Jestem bardzo zainteresowany tym. –

+3

To jest dość hack! 'iter (s)' zwraca iterator przez ciąg znaków. Mnożenie listy tego iteratora przez 2 spowoduje utworzenie dwóch odniesień ** do tego samego iteratora **. 'zip()' zwraca listę krotek zawierających element z każdego z jego argumentów. Ponieważ oba argumenty są tym samym iteratorem, zajmie to od niego dwukrotnie dla każdej krotki, zwracając krotkę każdego 2 sąsiedniego znaku. Nigdy bym nie pomyślał o próbie czegoś takiego. : D –

+0

@Matt: Jest to rdzeń większości "grupujących" przepisów, które widziałem i Max wyjaśnił to dobrze. Zostanie zaktualizowane, aby uwzględnić dwie krótkie funkcje w tym duchu. –

0

My try:

a = '0200A8C0' 
indices = range(0, 8, 2) 
data = [str(int(a[x:x+2], 16)) for x in indices] 
'.'.join(reversed(data)) 
Powiązane problemy