2013-05-15 26 views
9

Próbuję znaleźć sposób na wydrukowanie łańcucha znaków w postaci szesnastkowej. Na przykład mam ten ciąg, który następnie konwertuję na jego wartość szesnastkową.Python: wydrukuj zmienną w postaci heksadecymalnej

my_string = "deadbeef" 
my_hex = my_string.decode('hex') 

Jak mogę wydrukować my_hex jako 0xde 0xad 0xbe 0xef? Dziękuję Ci.

Aby moje pytanie było jasne ... Załóżmy, że mam pewne dane, takie jak 0x01, 0x02, 0x03, 0x04 zapisane w zmiennej. Teraz muszę wydrukować ją na hexie, aby ją odczytać. Chyba szukam pythonowego odpowiednika printf("%02x", my_hex). Wiem, że jest print '{0:x}'.format(), ale to nie zadziała z my_hex i nie będzie również pad z zerami.

Odpowiedz

17

Masz na myśli ciąg bajtów w my_hex, które chcesz wydrukować jako liczby szesnastkowe, prawda? Na przykład ze swojego przykład:

>>> my_string = "deadbeef" 
>>> my_hex = my_string.decode('hex') # python 2 only 
>>> print my_hex 
Þ ­ ¾ ï 

Oto jeden ze sposobów, aby to zrobić:

>>> print " ".join(hex(ord(n)) for n in my_hex) 
0xde 0xad 0xbe 0xef 

Zrozumienie przerywa ciąg znaków w bajtach ord() konwertuje każdy bajt do odpowiedniej liczby całkowitej, a hex() formaty każdej liczby całkowitej w z 0x##. Następnie dodajemy spacje pomiędzy.

Bonus: Jeśli użyjesz tej metody z ciągami Unicode, zrozumienie da ci znaki Unicode (nie bajty), a otrzymasz odpowiednie wartości szesnastkowe, nawet jeśli są większe niż dwie cyfry.

+0

Tego właśnie szukam. Dzięki. – Yaw

+0

Pamiętaj tylko, że to nie będzie działać na Pythonie 3.x, podczas gdy 'unhexlify'solution będzie ... –

+0

Która część nie zadziała? 'ord'? – alexis

1
print " ".join("0x%s"%my_string[i:i+2] for i in range(0,len(my_string),2)) 

jak ten

>>> my_string = "deadbeef" 
>>> print " ".join("0x%s"%my_string[i:i+2] for i in range(0,len(my_string),2)) 
0xde 0xad 0xbe 0xef 
>>> 

na niepowiązanych marginesie ... string używając jako nazwy zmiennej nawet jako przykład nazwy zmiennej jest bardzo zła praktyka

+0

to wygląda dzielenie łańcucha na pary znaków.Nie potrzebuję tego. – Yaw

+0

+1 za wywołanie za pomocą 'ciągu' jako nazwy zmiennej. Nadpisywanie typów bazowych za pomocą zmiennych może prowadzić do niesamowicie frustrującego debugowania, zaufaj mi. – Valdogg21

+0

@ Valdogg21: 'ciąg' nie jest typem podstawowym-- to jest' str'. Jest to jednak nazwa modułu stdlib. – DSM

0

przekonwertować ciąg do liczby całkowitej podstawa 16, a następnie szesnastkowa.

Są to funkcje wbudowane.

http://docs.python.org/2/library/functions.html#int

Przykład

>>> string = 'AA' 
>>> _int = int(string, base=16) 
>>> _hex = hex(_int) 
>>> print _int 
170 
>>> print _hex 
0xaa 
>>> 
+0

Nie sądzę, że to jest to, czego chce ... –

1

Można spróbować czegoś takiego chyba

new_str = "" 
str_value = "rojbasr" 
for i in str_value: 
    new_str += "0x%s " % (i.encode('hex')) 
print new_str 

Twój wyjście byłoby coś takiego

0x72 0x6f 0x6a 0x62 0x61 0x73 0x72 
+0

to nie jest to, o co OP prosi ... –

+0

Chciałem przetłumaczyć ciąg na szesnastkowy i nie dzielić go na pary 2. To moja wina, że ​​nie widziałem przykładu wyjścia –

+1

Nie twoja wina, jeśli spojrzysz na historię, zobaczysz, że oryginalne pytanie zostało przeczytane w ten sposób. OP nie mógł zdecydować, jak nazwać swoje zmienne, ale myślę, że naprawiłem to dla niego ... – alexis

1

sposób, że nie uda, jeśli ciąg wejściowy nie jest ważne par hex znaków ...

>>> import binascii 
>>> ' '.join(hex(ord(i)) for i in binascii.unhexlify('deadbeef')) 
'0xde 0xad 0xbe 0xef' 
0

Kolejna odpowiedź z późniejszego wydruku/format stylu jest:

res[0]=12 
res[1]=23 
print("my num is 0x{0:02x}{1:02x}".format(res[0],res[1]))