将Python字节“数组”转换为整数“数组”

13

这是我在Python中的第一段代码,我遇到了以下问题:

我正在读取一个二进制文件,如下:

def read_file(file):
    with open(file, "rb") as f:
        frame = f.read()
        print(type(frame)) #out = <class 'bytes'>
        return frame

我需要将所有向量转换为整数值,而不是将它们作为字节使用。

打印后,我得到类似于这样的输出:

print(frame[0:10])
b'\xff\xff\xff\xffXabccc'

然而,如果我只传递一个位置进行打印,我会得到这个结果:(整数值是正确的,但我只使用print函数获得它们)

print(frame[0])
255    
print(frame[1])
255
print(frame[2])
255
print(frame[3])
255
print(frame[4])
88
print(frame[5])
97
print(frame[6])
98
print(frame[7])
99
print(frame[8])
99
print(frame[9])
99
print(frame[10])
98

问题是:我如何一次性将数组中的所有位置转换?我想要运行以下代码

print(frame[0:10])

并获得类似的东西

[255, 255, 255, 255, 88, 97, 98, 99 ,99, 99, 98]

1
就此而言,frame并__不是__一个bytearray,而是一个bytes对象。这两者在Python中都存在,但前者是可变的,而你的bytes对象则不是。 - JohanL
4个回答

26

注意:此解决方案仅适用于Python 3。如需Python 2解决方案,请查看Scott Hunter的答案。

你可以使用列表推导式来完成这个任务:

In [1]: frame = b'\xff\xff\xff\xffXabccc'

In [2]: int_values = [x for x in frame]

In [3]: print(int_values)
[255, 255, 255, 255, 88, 97, 98, 99, 99, 99]

为确认这些确实存储为整数值,您可以使用它们:

In [4]: print([type(x) for x in int_values])
[<class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, 
<class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>]

2
注意:仅适用于Python 3(Python 2会给出字符列表)。 - glibdud

13

最简单且最明显的方法是将frame对象传递给列表构造函数。 不需要使用列表推导式:

>>> frame = b'\xff\xff\xff\xffXabccc'
>>> list(frame)
[255, 255, 255, 255, 88, 97, 98, 99, 99, 99]

注意:仅适用于Python 3(Python 2会给出字符列表)。 - glibdud

2
如果您想使用整数值列表,而不仅仅是打印它们,您可以使用以下代码:
[ord(x) for x in frame]

2
注意:仅适用于Python 2(Python 3会抛出TypeError)。 - glibdud

2
一种适用于Python2或3的解决方案是:

list(bytearray(frame))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接