【问题标题】:Perl unpack to Python ConversionPerl 解包到 Python 转换
【发布时间】:2016-08-02 17:27:16
【问题描述】:

我正在努力将以下语句从 Perl 复制到 Python,但我不确定如何使用 python struct 模块来执行。

所以我需要转换的代码是:

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

以上等价于

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

A2 似乎不是 Python 结构的好选择。谁能帮我解决这个问题?

【问题讨论】:

  • unpack("(A2)*", $s)$s 中的字符串拆分为两个字符的字符串。 $s =~ /..?/sg 是等价的。
  • 顺便说一句,map( hex, unpack("(A2)*", $hex_string) ) 最好写成unpack "C*", pack "H*", $hex_string

标签: python string python-2.7 hex unpack


【解决方案1】:

您可以使用intbase 参数将十六进制数字字符串转换为int

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

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

更新

要使用struct.unpack,首先使用binascii.unhexlify(或binascii.a2b_hex)将hex_string转换为二进制数据:

>>> 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)

【讨论】:

  • 非常感谢!像魅力一样工作:)
  • @ikegami,感谢您的反馈。我将在 Perl 中研究 unpack 并更新答案。
  • @ikegami,我相应地更新了答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2017-12-26
  • 2020-08-11
  • 1970-01-01
  • 2013-11-02
  • 2013-12-31
  • 2011-06-04
  • 2011-06-16
相关资源
最近更新 更多