2009-08-06 11 views
9

Mam ciąg znaków, który ma zarówno znaki binarne, jak i ciąg znaków i chciałbym przekonwertować go najpierw na binarny, a następnie na hex.Python: konwersja ciągów binarnych/szesnastkowych?

Ciąg jest jak poniżej:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j 

Jak mogę iść o konwersji ten ciąg w Pythonie tak, że wyjście w formacie hex jest podobny do tego poniżej?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F 
+5

można opracować na tłumaczeniu zamierzonego? Wydaje mi się, że przykładowy ciąg znaków i wynik w postaci szesnastkowej to nie to samo ... czy jest to pojedyncza, niedrukowalna, kodowana heksadecymalnie postać, czy też jest to tekstowa reprezentacja tego? Jestem zdezorientowany przez ciąg znaków zawierający znaki binarne (co przez to rozumiesz) i chcesz go przekonwertować na binarny, a następnie na hex ... – Adriaan

+0

Zrób to: 'print (repr (your_string)))' i skopiuj/wklej wynik do twojego pytania. Powiedz nam, jaka wersja Pythona i jakiej platformy. –

Odpowiedz

22

Można użyć ord i hex tak:

>>> s = 'some string' 
>>> hex_chars = map(hex,map(ord,s)) 
>>> print hex_chars 
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67'] 
>>> hex_string = "".join(c[2:4] for c in hex_chars) 
>>> print hex_string 
736f6d6520737472696e67 
>>> 

też użyć wbudowanego Kodowanie:

>>> s = 'some string' 
>>> print s.encode('hex_codec') 
736f6d6520737472696e67 
>>> 
+1

Twoja wersja z 'hex' i' ord' nie działa niezawodnie. Użyj "% 2.2x" .__ mod__ zamiast hex, możesz także uniknąć 'c [2: 4]'. W rezultacie będzie wyglądać następująco: "" ".join (mapa ("% 2.2x ".__ mod__, map (ord, s)))'. Wersja kodowania jest oczywiście lepsza. :-) –

+0

Świetnie, odpowiedź !! – Japanish

1

Szybsze rozwiązanie zobacz:

from timeit import Timer 

import os 
import binascii 

def testSpeed(statement, setup = 'pass'): 
    print '%s' % statement 
    print '%s' % Timer(statement, setup).timeit() 

setup = """ 
import os 

value = os.urandom(32) 
""" 

# winner 
statement = """ 
import binascii 

binascii.hexlify(value) 
""" 

testSpeed(statement, setup) 

# loser 
statement = """ 
import binascii 

value.encode('hex_codec') 
""" 

testSpeed(statement, setup) 

wyniki:

import binascii 

binascii.hexlify(value) 

2.18547999816 

value.encode('hex_codec') 

2.91231595077 
7
>>> import binascii 

>>> s = '2F' 

>>> hex_str = binascii.b2a_hex(s) 

>>> hex_str 

>>> '3246' 

LUB

>>>import binascii 

>>> hex_str = binascii.hexlify(s) 

>>> hex_str 
>>> '3246' 
>>>