2009-01-14 21 views
50

I bir dizisindeki çok daha uzun Uzun hex dizesinden python bayt nesnesi nasıl oluşturulur?

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

gibi

birkaç kilobayt heks uzun bir sayı dizisi vardır. Bunu python 2.6/3'teki bir bayt nesnesine dönüştürmenin yerleşik bir yolu var mı?

+3

Not . s.decode ('hex'), bir hevessizlik (ler) gibi bir str döndürür. bytearray.fromhex (s) bir bytearray döndürür. Bu sorunun ifadesi göz önüne alındığında, büyük yeşil onay işaretinin s.decode ('hex') üzerinde değil bytearray.fromhex (ler) üzerinde olması gerektiğini düşünüyorum. –

+0

Python'da [onaltılık dizgiden bayt dizisine olası yinelenen] (http://stackoverflow.com/questions/5649407/hexadecimal-string-to-byte-array-in-python) –

+0

Bir sorunun kopyası nasıl olabilir? 2 yıl sonra mı oluşturuldu? – recursive

cevap

35

Çalışmaları ve daha yüksek python3 dahil:

result = bytearray.fromhex('deadbeef') 

Not: Python 2.6 bytearray.fromhex() fonksiyonu ile bir hata var gibi gözüküyor. python.org dokümantasyon işlevi bağımsız değişken olarak bir dize kabul ettiğini bildiren, ancak uygulandığında, aşağıdaki hata atılır: cevaplar aşağıda hem görünebilir ama onlar değerlerin farklı türde dönmek olduğunu

>>> bytearray.fromhex('B9 01EF') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: fromhex() argument 1 must be unicode, not str` 
+2

Ve bir ek adım daha istiyorum byte dizgisi (örn. Python 3'ün b '\ x04 \ xea [...]'), byte byt by by by by by (bytearray.fromhex ('deadbeef')) ' – berto

+2

@berto: bu durumda binascii.unhexlify() 'biçiminde daha doğrudan bir yol. –

+0

Teşekkürler, @MartijnPieters, bir şans vereceğim – berto

28

binascii module

from binascii import unhexlify 
b = unhexlify(myhexstr) 
+4

Bunu yapmanın iki yolu 2.x, 3.x'te üç yol. "Yapmanın tek bir yolu var" için çok fazla ... – technomalogical

+0

Diğer iki yol daha 'yerleşik' olduğundan, aslında bunlardan birini kullanacağım. –

+0

@technomalogical: Yorumunuz cevabıyla alakasız; belki de onu silmeli ve comp.lang.python'a gönderilmelidir. – tzot

39

Sen altıgen codec ile bunu yapabilirsiniz deneyin. yani: Python 2.7

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44' 
>>> s.decode('hex') 
'\x00\x00\x00\x00\x00\[email protected]\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\[email protected]\xa4=P\x05\xbdD' 
+23

' u kullanmanız gerektiği anlamına gelir. Sadece 2.x, 3.x değil. –

+9

'codecs.decode ('0a0a0a', 'hex_codec')' 2.x ve 3.x için çalışmalıdır :-) – Abbafei

32
result = bytes.fromhex(some_hex_string) 
+10

Sadece Python 3 + 'da çalışıyorum eğer yanılmıyorsa – Triptych

-2
import binascii 

binascii.b2a_hex(obj) 
İlgili konular