如何将一个十六进制值字符串转换为整数列表?

12

我有一长串十六进制数值,它们看起来都很相似,像这样:

'\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00'

实际字符串是一个波形的1024帧。我想将这些十六进制值转换为整数值列表,例如:

[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0]

我该如何将这些十六进制值转换为整数?


你有一个字节字符串,在打印时,Python会为你转换成字符串文字表示形式。\x00 转义用于任何不可打印的ASCII字符。 - Martijn Pieters
3个回答

9

使用struct.unpack函数:

>>> import struct
>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00'
>>> struct.unpack('11B',s)
(0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0)

这会给你一个元组而不是列表,但如果需要,我相信你可以将其转换。

8
你可以使用 ord() 结合 map()
>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00'
>>> map(ord, s)
[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0]

这并不是最好的方法,因为可以使用struct.unpack()将字节解释为其他类型。 - Martijn Pieters
顺便提一下,这个解决方案比struct.unpack慢了6倍。 当进行一百万次迭代时,struct需要0.3秒,而map(ord, s)需要1.8秒。 - Martijn Pieters
@MartijnPieters 如果我们在寻找波形处理的高性能,我们可能会选择其他语言而不是Python。 - cdhowie
2
@MartijnPieters 相对而言,是的..但相对于脚本中发生的其他事情,需要多少 CPU 时间呢?再次强调,先编写代码,然后再进行优化。 - cdhowie
1
@cdhowie: 但是提前知道哪种方法更快能让你赢得一半的胜利。Stack Overflow为你提供了了解给定操作的选项的机会;通过在这里的答案中添加时间信息,你可以在需要优化时做出更明智的选择,而无需自己去优化。 - Martijn Pieters
显示剩余12条评论

2
In [11]: a
Out[11]: '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00'

In [12]: import array

In [13]: array.array('B', a)
Out[13]: array('B', [0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0])

以下是一些时间记录:

$ python -m timeit -s 'text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00";' ' map(ord, text)'
1000000 loops, best of 3: 0.775 usec per loop

$ python -m timeit -s 'import array;text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"' 'array.array("B", text)'
1000000 loops, best of 3: 0.29 usec per loop

$ python -m timeit -s 'import struct; text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"'  'struct.unpack("11B",text)'
10000000 loops, best of 3: 0.165 usec per loop

不错;执行一百万次只需 0.665 秒。 struct 仍然更快,但你可以用更少的步骤操作一个 array 并得到一个字节表示。 - Martijn Pieters
@MartijnPieters - 大师的赞誉!Guido不可能错 优化趣闻 - Fredrik Pihl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接