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分支更好的选择?
你有三个选择:
使用bytearray():
ba = bytearray(foo)
ba[0]
Run Code Online (Sandbox Code Playgroud)使用该struct模块将字节解压缩为整数:
import struct
struct.unpack('{}B'.format(len(foo)), foo)
Run Code Online (Sandbox Code Playgroud)使用该array模块按顺序将字节解压缩为整数:
import array
array.array('B', foo)
Run Code Online (Sandbox Code Playgroud)演示(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)