2016-04-12 6 views
1

Я изо всех сил пытаюсь воспроизвести приведенный ниже оператор Perl на Python, но я не уверен, как работать с использованием модуля struct python.Perl unpack to Python Conversion

Так код, который нужно преобразовать это:

my $hex_string = "DEADBEEF"; 
my @bytes = map(hex, unpack("(A2)*", $hex_string)); 

выше эквивалентно

my @bytes = (0xDE, 0xAD, 0xBE, 0xEF); 

A2 не кажется хорошим вариантом для Python структуры. Кто-нибудь может мне с этим помочь?

+0

'распаковка ("(A2) *", $ s)' разбивает строку в '$ s' в строки два-символов. '$ s = ~ /..?/sg' будет эквивалентным. – ikegami

+0

Кстати, 'map (hex, unpack (" (A2) * ", $ hex_string))' лучше писать как 'unpack 'C *", pack "H *", $ hex_string' – ikegami

+0

Дубликат [Как создать объект байтов python из длинной шестнадцатеричной строки?] (http://stackoverflow.com/questions/443967/how-to-create-python-bytes-object-from-long-hex-string?) – ikegami

ответ

1

Вы можете использовать int с base аргументом для преобразования шестнадцатеричной числовой строки в int:

>>> int('15', base=16) 
21 

>>> val = 15 
>>> int(str(val), base=16) 
21 

UPDATE

Чтобы использовать struct.unpack, первый CONVER hex_string в двоичные данные используя binascii.unhexlify (или binascii.a2b_hex):

>>> import struct, binascii 
>>> hex_string = "DEADBEEF" 
>>> binascii.unhexlify(hex_string) # Hexa decimal -> binary data 
'\xde\xad\xbe\xef' 

>>> struct.unpack('4B', binascii.unhexlify(hex_string)) # 4 = 8/2 
(222, 173, 190, 239) 
>>> struct.unpack('4B', binascii.unhexlify(hex_string)) == (0xDE, 0xAD, 0xBE, 0xEF) 
True 
>>> struct.unpack('{}B'.format(len(hex_string) // 2), binascii.unhexlify(hex_string)) 
(222, 173, 190, 239) 
+0

Спасибо большое! Работает как шарм :) – Mastermind

+0

@ikegami, Благодарим вас за отзыв. Я буду изучать 'unpack' в Perl и обновлять ответ. – falsetru

+0

@ikegami, я обновил ответ соответственно. Спасибо. – falsetru