2013-02-19 24 views
7

mam długi ciąg wartości szesnastkowe, że wszystko wygląda podobnie do tego:Jak przekonwertować ciąg wartości szesnastkowych na listę liczb całkowitych?

'\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 

Rzeczywiste ciąg wynosi 1024 klatek przebiegu. Chcę przekonwertować te wartości szesnastkowe do listy wartości całkowitych, takie jak:

[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0] 

Jak przekonwertować te wartości hex do int?

+0

Masz ciąg bajtów, który python, podczas drukowania, konwertuje na reprezentację tekstową ciąg znaków dla Ciebie. Zwolnienia '\ x00' są używane dla dowolnego bajta, który nie jest drukowalnym znakiem ASCII. –

Odpowiedz

5

Można użyć ord() w połączeniu z map():

>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 
>>> map(ord, s) 
[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0] 
+0

Nie jest to najlepszy sposób, nie z 'struct.unpack()' dostępny i zdolny do interpretowania bajtów, jak inne typy. –

+0

@MartijnPieters - Ale sprytny sposób na zrobienie tego z powodu bardzo ograniczonego problemu ... Uśmiechnęłam się. – mgilson

+0

To rozwiązanie jest 6 razy wolniejsze niż 'struct.unpack', btw ..' struct' zajmuje 0,3 sekundy na milion iteracji, podczas gdy 'map (ord, s)' potrzebuje 1,8 sekundy. –

6

użycie struct.unpack:

>>> import struct 
>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 
>>> struct.unpack('11B',s) 
(0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0) 

To daje tuple zamiast list, ale ufam można przekonwertować go jeśli trzeba.

1
In [11]: a 
Out[11]: '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 

In [12]: import array 

In [13]: array.array('B', a) 
Out[13]: array('B', [0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0]) 

Niektóre czasy;

$ python -m timeit -s 'text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00";' ' map(ord, text)' 
1000000 loops, best of 3: 0.775 usec per loop 

$ python -m timeit -s 'import array;text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"' 'array.array("B", text)' 
1000000 loops, best of 3: 0.29 usec per loop 

$ python -m timeit -s 'import struct; text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"' 'struct.unpack("11B",text)' 
10000000 loops, best of 3: 0.165 usec per loop 
+0

Nieźle; 0,665 sekundy na milion iteracji. 'struct' jest jeszcze szybsze, ale możesz manipulować' tablicą' i uzyskać reprezentację bajtów z mniejszą liczbą kroków. –

+0

jak głupio! Właśnie zauważyłem, zaktualizowałem! –

+1

Czasy z ciągiem 1024-bajtowym: http://pastie.org/6226168; array wygrywa wtedy. –

Powiązane problemy