2016-08-08 92 views
5

Próbuję użyć unpack łańcucha szesnastkowego do podwójnego w języku Python.Czytanie heksadecymatu dla pythonu z podwójną precyzją:

Kiedy próbuję rozpakować następujące elementy:

unpack('d', "4081637ef7d0424a"); 

pojawia się następujący błąd:

struct.error: unpack requires a string argument of length 8 

nie zrobić bardzo dużo dla mnie sensu, ponieważ podwójne ma długość 8 bajtów, i

2 postać = 1 szesnastkowy = 1 bajt

W gruncie rzeczy, podwójne o długości 8 bajtów byłoby ciągiem 16-znakowym.

Wszelkie wskazówki dotyczące rozpakowania tego heksa do podwójnego byłyby bardzo mile widziane.

+0

"Łańcuch" oczekiwany przez 'struct.unpack' nie jest łańcuchem szesnastkowym, to surowe bajty. W języku Python3 będzie to "bajty", a nie "str". Użyj 'bytearray.fromhex' lub po prostu' str.decode', patrz odpowiedź Svena Marnacha. – L3viathan

Odpowiedz

5

trzeba konwertować cyfry hex na ciąg binarny pierwszy:

struct.unpack('d', "4081637ef7d0424a".decode("hex")) 

lub

struct.unpack('d', binascii.unhexlify("4081637ef7d0424a")) 

Ta ostatnia wersja działa zarówno w Pythonie 2 i 3, pierwszy tylko w Pythonie 2

+0

@ L3viathan 'binascii' nie wymaga biblioteki innej firmy. Jest to część standardowej biblioteki Pythona, a na CPython jest nawet wkompilowana w interpreter, więc jest w zasadzie importowana po uruchomieniu interpretera. –

0

Spróbuj tego:

a = "\x40\x81\x63\x7e\xf7\xd0\x42\x4a" 
unpack('d', a);