我有一个类似于下面的字节串。
foo = b"\x00\xff"
我想将 foo
每个十六进制值转换为整数。我可以在 Python 3 中使用以下内容。
In [0]: foo[0]
Out[0]: 0
In [1]: foo[1]
Out[1]: 255
Python 2 需要调用 ord()
。
In [0]: ord(foo[0])
Out[0]: 0
In [1]: ord(foo[1])
Out[1]: 255
有没有一种好的方法可以在必须同时适用于 Python 2 和 3 的代码中编写此代码? six
包有一个 six.byte2int()
函数,但它不起作用,因为它只查看第一个字节和 six.byte2int(foo[0 ]
在 Python 3 上失败,因为 foo[0]
在 Python 3 中是一个整数。
有没有比 if six.PY2
分支更好的选择?
最佳答案
你有三个选择:
使用
bytearray()
:ba = bytearray(foo) ba[0]
使用
struct
module将字节解压缩为整数:import struct struct.unpack('{}B'.format(len(foo)), foo)
使用
array
module按顺序将字节解压缩为整数:import array array.array('B', foo)
演示(Python 2.7):
>>> import struct, array
>>> foo = b"\x00\xff"
>>> list(bytearray(foo))
[0, 255]
>>> struct.unpack('{}B'.format(len(foo)), foo)
(0, 255)
>>> array.array('B', foo)
array('B', [0, 255])
演示(Python 3.4):
>>> import struct, array
>>> foo = b"\x00\xff"
>>> list(bytearray(foo))
[0, 255]
>>> struct.unpack('{}B'.format(len(foo)), foo)
(0, 255)
>>> array.array('B', foo)
array('B', [0, 255])
关于将字节转换为整数的 Python 2 和 3 兼容方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121553/