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

时间:2014-09-30 13:01:39

标签: python python-3.x python-2.x

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

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]分支更好的选择?

3 个答案:

答案 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 modulevalues = 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