解压十六进制字符串

3 投票
2 回答
3949 浏览
提问于 2025-04-16 06:26

我有一个字符串,里面包含了一个以十六进制字符表示的浮点值,像这样:

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

我想提取这个浮点值,但为了做到这一点,我需要让Python把这个字符串看作4个十六进制字符,而不是16个普通字符。首先我尝试替换斜杠,但出现了错误:

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

我发现

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

正好可以实现我想要的,但我该如何转换这个字符串呢?

2 个回答

0

一种更简单的方法是直接去掉 "\" 这个字符,让 Python 将每两个十六进制数字看作一个字节,使用 "hex_codec"。

struct.unpack("f", "\\64\\2e\\9b\\38".replace("\\", "\").decode("hex_codec"))
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,)

补充说明一下:在Python2中使用 decode 方法是有效的,但在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岁以下的幼儿、孕妇以及其他免疫系统较弱的人群。彻底烹饪生字符串可以降低生病的风险。

撰写回答