2016-04-12 13 views
1

Ich habe mich Mühe, die folgende Anweisung von Perl nach Python zu replizieren, aber ich bin nicht wirklich sicher, wie Sie mit dem Python-Struct-Modul durchführen.Perl entpacken, um Python-Konvertierung

So ist der Code, den ich konvertieren müssen, ist:

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

Die oben entspricht

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

A2 keine gute Option für Python-Struktur zu sein braucht scheint. Kann mir jemand dabei helfen?

+0

'auspacken ("(A2) *", $ s)' teilt den String in 'S' in zwei Zeichenketten $. '$ s = ~ /..?/ sg' wäre äquivalent. – ikegami

+0

Übrigens, 'map (hex, entpacken (" (A2) * ", $ hex_string)) ist besser geschrieben als' entpacken 'C * ", pack" H * ", $ hex_string" – ikegami

+0

Duplizieren von [How to Python-Bytes-Objekt aus langen Hex-String erstellen?] (http://stackoverflow.com/questions/443967/how-to-create-python-bytes-object-from-long-hex-string?) – ikegami

Antwort

1

Sie können int mit base Argument verwenden, um Hexadezimalzahl Zeichenfolge int zu konvertieren:

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

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

UPDATE

struct.unpack, erste conver die hex_string in binäre Daten nutzen zu können, mit binascii.unhexlify (oder 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

Vielen Dank! Funktioniert wie ein Charme :) – Mastermind

+0

@ikegami, Vielen Dank für Ihr Feedback. Ich werde in Perl "entpacken" und die Antwort aktualisieren. – falsetru

+0

@ikegami, habe ich die Antwort entsprechend aktualisiert. Vielen Dank. – falsetru