Python 2和3兼容的方法将字节转换为整数

Ayr*_*yrx 4 python python-2.x python-3.x

我有一个类似于以下的字节字符串.

foo = b"\x00\xff"
Run Code Online (Sandbox Code Playgroud)

我想将foo每个十六进制值转换为整数.我可以在Python 3中使用以下内容.

In [0]: foo[0]
Out[0]: 0  
In [1]: foo[1]
Out[1]: 255  
Run Code Online (Sandbox Code Playgroud)

Python 2需要一个ord()调用.

In [0]: ord(foo[0])
Out[0]: 0  
In [1]: ord(foo[1])
Out[1]: 255  
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法可以在代码中编写它,这些代码必须兼容Python 2和3?该six软件包有一个six.byte2int()功能但不起作用,因为它只查看第一个字节并six.byte2int(foo[0]在Python 3上失败,因为它foo[0]是Python 3 中的一个整数.

有没有比if six.PY2分支更好的选择?

Mar*_*ers 9

你有三个选择:

演示(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])
Run Code Online (Sandbox Code Playgroud)

演示(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])
Run Code Online (Sandbox Code Playgroud)

  • @vonec:Python 2和3再次兼容?如果`foo`是一个整数序列,那么`bytes(bytearray(foo))`或`struct.pack('{} B'.format(len(foo)),*foo)`或`array.array ('B',foo).tostring()`都可以. (2认同)