我有一个类似于以下的字节字符串。
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()
函数但不起作用,因为它只查看第一个字节并且{3}在Python 3上失败,因为six.byte2int(foo[0]
是Python中的整数3。
是否有比foo[0]
分支更好的选择?
答案 0 :(得分:9)
您有三种选择:
使用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])
答案 1 :(得分:1)
看看the struct
module。 values = struct.unpack('BB', foo)
应该这样做。
答案 2 :(得分:0)
我碰到了这个,答案不包括六个。索引。
>>> import six
>>> a = b"test"
>>> for i in range(len(a)):
... print(six.indexbytes(a, i))
...
116
101
115
116