2011-09-29 14 views
6

Mam pewne trudności z zamianą heksa na int/char (najlepiej char). Za pośrednictwem strony internetowej; http://home2.paulschou.net/tools/xlate/ Wprowadzam heks C0A80026 do szesnastkowej skrzynki, w polu DEC/CHAR poprawnie wyprowadza IP, którego oczekiwałem.Python - Konwertowanie hexa na INT/CHAR

Te dane są pobierane z zewnętrznej bazy danych i nie mam świadomości, w jaki sposób są zapisywane, więc wszystko, z czym muszę pracować, to sam łańcuch szesnastkowy.

Próbowałem użyć funkcji binascii.unhexlify, aby sprawdzić, czy mogę ją odkodować, ale obawiam się, że mogę nie mieć wystarczająco dobrego zrozumienia heksu, aby docenić to, co robię.

Próby drukowania przy użyciu odlewu int() również nie przyniosły wymaganych wyników. Potrzebuję jakiegoś sposobu przekonwertowania z tego ciągu szesnastkowego (lub jednego podobnego) do oryginalnego adresu IP.

AKTUALIZACJA: Dla każdego, kto natknie się na to w przyszłości, nieco zmodyfikowałem poniższą odpowiedź, aby zapewnić dokładny wydruk jako adres IP przy użyciu;

dec_output = str(int(hex_input[0:2], 16)) + "." + str(int(hex_input[2:4], 16)) + "." + str(int(hex_input[4:6], 16)) + "." + str(int(hex_input[6:8], 16)) 
+0

możliwe duplikat [Convert ciąg szesnastkowy do int w Pythonie] (http://stackoverflow.com/questions/ 209513/convert-hex-string-to-int-in-python) –

+0

To rozwiązanie nie działa z moim problemem – Draineh

+0

Proszę wyjaśnić dokładnie, w jaki sposób pytanie o duplikowanie nie jest duplikatem. Szczegóły mają znaczenie. "nie działa z moim problemem" jest zbyt niejasne, by cokolwiek znaczyć. –

Odpowiedz

6

Jeśli chcesz dostać 4 oddzielne numery od tego, a następnie potraktować go jako 4 oddzielnych numerów. Nie potrzebujesz binascii.

hex_input = 'C0A80026' 
dec_output = [ 
    int(hex_input[0:2], 16), int(hex_input[2:4], 16), 
    int(hex_input[4:6], 16), int(hex_input[6:8], 16), 
] 
print dec_output # [192, 168, 0, 38] 

Można to uogólnić, ale zostawiam to jako ćwiczenie dla ciebie.

+0

Perfect, dziękuję – Draineh

0

Mam nadzieję, że to, czego się spodziewać:

hex_val = 0x42424242  # hexadecimal value 
int_val = int(hex_val) # integer value 
str_val = str(int_val) # string representation of integer value 
+0

Dosłowne '0x4242422' już tworzy liczbę całkowitą,' int (hex_val) 'jest zbędne. –

4

Można również potrzebują funkcji Chr:

chr(65) => 'A' 
+0

chr akceptuje tylko liczby całkowite. Pytanie jasno stwierdza, że ​​użytkownik musi przekonwertować heks w int/char (nie int do char), a chr przyjmuje tylko liczby całkowite, więc nie jest to rozwiązanie. –

1
>>> htext='C0A80026' 
>>> [int(htext[i:i+2],16) for i in range(0,len(htext),2)] 
# [192, 168, 0, 38] 
6

prosty sposób

>>> s = 'C0A80026' 
>>> map(ord, s.decode('hex')) 
[192, 168, 0, 38] 
>>> 

jeśli wolisz listowych

>>> [ord(c) for c in s.decode('hex')] 
[192, 168, 0, 38] 
>>> 
+0

Niezły.Osobiście piszę to jako zrozumienie listy, ale to jest wyłącznie smak. Lubię używać 'decode' i' ord'. – neil

+0

dzięki @neil. Lubię też rozumienie list. –