Jaki jest najlepszy sposób przekształcenia łańcucha znaków w tym formularzu w adres IP: "0200A8C0"
. "Oktety" obecne w łańcuchu są w odwrotnej kolejności, tj. Dany ciąg znaków powinien generować 192.168.0.2
.Konwertuj ciąg znaków "little endian" na adres IP w języku Python
Odpowiedz
sieciowy jest zapewniony przez moduł gniazda.
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'
>>>
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
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. –
@Max, odpowiedź Rogera zawiera bardzo intrygujący sposób na zrobienie tego. –
>>> 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
@Roger, jak działa 'zip (* [iter (s)] 2)'? Jestem bardzo zainteresowany tym. –
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 –
@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. –
My try:
a = '0200A8C0'
indices = range(0, 8, 2)
data = [str(int(a[x:x+2], 16)) for x in indices]
'.'.join(reversed(data))
- 1. Konwertuj ciąg adresu IP na binarny w języku Python
- 2. Zamieszanie w htons- little endian/big endian
- 3. Bitshifting na little-endian i big-endian
- 4. Little endian Vs Big endian
- 5. Konwertuj ciąg na Enum w języku Python
- 6. Konwertuj ciąg znaków na JSON w języku Python?
- 7. Little-Endian Signed Integer
- 8. Little/Big Endian
- 9. Szybka konwersja little-endian do big-endian w ASM
- 10. Konwertuj tablicę liczb całkowitych na ciąg w języku Python
- 11. Konwertuj ciąg znaków RTF na ciąg XAML
- 12. Jak pisać big endian ByteBuffer do little endian w Javie
- 13. Konwertuj ciąg na liczbę całkowitą z dziesiętnym w języku Python
- 14. Konwertuj łańcuch szesnastkowy na adres IP
- 15. Jak przekonwertować strukturę big-endian do little-endian-struct?
- 16. Konwertuj ciąg znaków na odmianę w języku C++
- 17. Konwertuj ciąg znaków na datetime
- 18. Konwertuj ciąg znaków na float?
- 19. Jak bezboleśnie serializować Little-endian PODs?
- 20. Konwertuj ciąg znaków na datę w java
- 21. Konwertuj biginta na ciąg znaków w Go
- 22. Konwertuj ciąg znaków na kod w schemacie
- 23. Konwertuj uint64 na ciąg znaków w golang
- 24. Konwertuj obiekt datetime na łańcuch dat tylko w języku Python
- 25. Konwertuj adres IP na 32-bitową liczbę całkowitą w Ruby
- 26. Konwertuj ciąg na tablicę znaków swift 2.0
- 27. Konwertuj ciąg znaków SQL na znacznik czasu
- 28. Konwertuj ciąg znaków Base64 na plik obrazu?
- 29. Konwertuj ciąg znaków javascript na tablicę php
- 30. Konwertuj ciąg znaków HTML na obrazki
Najbardziej przydatna odpowiedź, IMO. –
Chcesz " Omnifarious
@Owspółmiernie, jak dokładnie to "długie/int" ma wpływ na to tutaj? –