2015-11-02 60 views
0

当我使用python的struct.pack方法时,我得到一个奇怪的结果。 的代码看起来是这样的:当使用Python的struct.pack方法时得到意想不到的结果

>>> struct.pack('<i', 0x01d1f23a) 

结果我想要得到的是转换为小端十六进制地址(“<”)。 编辑: 等价于Perl的(对不起,打印的,不知道的Perl)

#!/usr/bin/perl 
my $eip = pack('V',0x01ccf23a); 
print "$eip[0]"; 
print "$eip[1]"; 
print "$eip[2]"; 
print "$eip[3]"; 

结果是:582422041

我需要实现与Python相同的结果。

+0

那么你期望的结果是什么,你取而代之的是什么? – jonrsharpe

+0

你能解释为什么冒号是个问题吗?你用什么输出字符串?你想要一个长度为4的字符串,包含四个字符:chr(0x3a),chr(0xf2),chr(0xd1)和chr(0x01)吗?还是你想要一个长度为16的字符串在打印时看起来像'\ x3a \ xf2 \ xd1 \ x01'? (如果后者,*为什么*?)还是别的? –

+0

嗨马克我刚刚编辑我的问题。我想要的结果是这样的:582422041 –

回答

1

一切似乎是罚款:

>>> struct.pack('<i', 0x01d1f23a) 
b':\xf2\xd1\x01' 

最显著字节01存储在最高的内存地址,从而使小端。我唯一可能注意到的是b'\x3a'看起来像:,因为它是一个有效的ASCII符号。

如果答案没有解决您的问题,请更新您的帖子并提供详细信息。

编辑

为了具有表示为十六进制形式的字节序列的数目,无需转换到ASCII,使用以下行:

>>> ' '.join(hex(b) for b in struct.pack('<i', 0x01d1f23a)) 
'0x3a 0xf2 0xd1 0x1' 

使用str代替hex到得到十进制表示。

>>> ' '.join(str(b) for b in struct.pack('<i', 0x01d1f23a)) 
'58 242 209 1' 
+0

“:”是问题,我需要十六进制值保持为十六进制值并转换为ASCII。类似于perl pack('V')方法 –

+0

@Igalname更新了我的帖子。 – Vovanrock2002