2016-04-12 41 views
1

Aşağıdaki ifadeyi Perl'den Python'a kopyalamak için kendim mücadele ediyorum ama python struct module kullanılarak nasıl gerçekleştirileceğinden emin değilim. Perl paketini açmak için Python Conversion

Yani dönüştürmek için gereken koddur: Python yapı için iyi bir seçenek gibi görünüyor gelmez

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

yukarıda

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

A2 eşdeğerdir. Birisi bana yardım edebilir mi?

+0

'unpack ("(A2) *" $ s)' iki karakterlik dizeleri içine '$ s' dizeyi böler. '$ s = ~ /..?/ sg' eşdeğer olur. – ikegami

+0

Bu arada, harita (hex, unpack() ("(A2) *", $ hex_string)) 'daha iyi" unpack "olarak yazılır C *", "H *" paketini, $ hex_string' – ikegami

+0

[Nasıl yapılır? uzun hex dizesinden python bayt nesnesi oluşturulsun?] (http://stackoverflow.com/questions/443967/how-to-create-python-bytes-object-from-long-hex-string?) – ikegami

cevap

1

Sen int için onaltılık sayı dizesi dönüştürmek için base argüman ile int kullanabilirsiniz:

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

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

GÜNCELLEME

ikili verilere struct.unpack, ilk conver hex_string kullanmak için binascii.unhexlify kullanarak (veya 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

Çok teşekkürler! Bir çekicilik gibi çalışır :) – Mastermind

+0

@ikegami, Geri bildiriminiz için teşekkür ederiz. Perl'de 'unpack 'çalışacağım ve cevabı güncelleyeceğim. – falsetru

+0

@ikegami, cevabı buna göre güncelledim. Teşekkür ederim. – falsetru