用十六进制解包字符串

时间:2010-11-02 15:01:25

标签: python struct

我有一个包含十六进制字符的浮点值的字符串,如下所示:

"\\64\\2e\\9b\\38"

我想提取浮点数,但为了做到这一点,我必须让Python将字符串视为4个十六进制字符,而不是16个常规字符。首先我尝试替换正斜杠,但是我收到了一个错误:

>>>> hexstring.replace("\\", "\x")
ValueError: invalid \x escape

我发现了

struct.unpack("f", "\x64\x2e\x9b\x38") 

正是我想要的,但我该如何转换字符串?

2 个答案:

答案 0 :(得分:6)

每当我看到一个(格式错误的)字符串时,例如由这个字符列表组成的字符串:

['\\', '\\', '6', '4', '\\', '\\', '2', 'e', '\\', '\\', '9', 'b', '\\', '\\', '3', '8']

当预期的是这个字符列表时

['\x64', '\x2e', '\x9b', '\x38']

我找到了decode('string_escape')方法。

但是要使用它,我们需要用r'\\'替换两个字符r'\x'。 您可以使用replace(...)方法。

In [37]: hexstring=r'\\64\\2e\\9b\\38'

In [38]: struct.unpack('f',(hexstring.replace(r'\\',r'\x').decode('string_escape')))
Out[38]: (7.3996168794110417e-05,)

In [39]: struct.unpack("f", "\x64\x2e\x9b\x38")
Out[39]: (7.3996168794110417e-05,)

PS。这种decode方法的使用在Python2中有效,但在Python3中不起作用。在Python3中,codecs.decode严格意味着将字节对象转换为字符串对象(错误,Python2调用unicode对象),而在上面的示例中,decode实际上是将字符串对象转换为字符串对象。 Python2中的大多数解码编解码器确实将字符串对象转换为unicode对象,但是像'string_escape'这样的少数编解码器却没有。一般来说,他们已被转移到其他模块,或以其他方式调用。

在Python3中,等同于hexstring.decode('string_encode')的是codecs.escape_decode(hexstring)[0]

编辑:另一种方式,与jsbueno的答案相似,是使用binascii.unhexlify

In [76]: import binascii
In [81]: hexstring=r"\\64\\2e\\9b\\38"
In [82]: hexstring.replace('\\','')
Out[82]: '642e9b38'

In [83]: binascii.unhexlify(hexstring.replace('\\',''))
Out[83]: 'd.\x9b8'

这些timeit结果表明binascii.unhexlify是最快的:

In [84]: %timeit binascii.unhexlify(hexstring.replace('\\',''))
1000000 loops, best of 3: 1.42 us per loop

In [85]: %timeit hexstring.replace('\\','').decode('hex_codec')
100000 loops, best of 3: 2.94 us per loop

In [86]: %timeit hexstring.replace(r'\\',r'\x').decode('string_escape')
100000 loops, best of 3: 2.13 us per loop

根据评论编辑:

  

这个答案包含原始字符串。该   公共卫生部提出建议   吃生的或未煮熟的字符串   对每个人都构成健康风险,但是   特别是老人,年轻人   4岁以下儿童,孕妇   和其他高度敏感的   免疫力下降的个体   系统。彻底煮熟的原料   字符串可以降低患病的风险。

答案 1 :(得分:0)

更简单的方法是删除“\”字符,并让python使用“十六进制代码”将每两个十六进制数字看作一个字节: