将Python字节转换为“无符号8位整数”

22

我正在从socket中读取一个字节数组/列表。 我希望Python将第一个字节视为“无符号8位整数”。 如何获取它的整数值作为无符号8位整数?


2
如果您愿意依赖于 numpy,则其中一些函数需要一个 dtype 参数,您可以将其设置为 numpy.uint8。例如:bytestream = numpy.fromfile(infile, dtype=numpy.uint8) - CrazyPyro
3个回答

23
使用struct模块。
import struct
value = struct.unpack('B', data[0:1])[0]

我们必须指定一个范围为1(0:1),因为否则Python 3会自动转换为整数。
请注意,即使您只解包一个项目,unpack始终返回一个元组。
另外,请查看this SO question

那么 struct.unpack('B', data[0])[1] 中存储了什么? - bbb
data[0] 是您接收到的第一个字节。unpack("B", data[0]) 将该字节视为 8 位无符号整数(在 C 中称为 unsigned char),并返回包含该整数的元组(如果您传递了两个字节给 unpack,您将执行类似于 unpack("BB", data[0:2]) 的操作,并获得一个 2-元组)。最后的 [0] 获取元组中的第一个(也是唯一的)项。 - codeape
1
在这种情况下,它是一个只有一个元素的元组,因此struct.unpack('B', data[0])[1]将引发IndexError。 这里是struct的典型用法示例:https://dev59.com/o0rSa4cB1Zd3GeqPY8Ca#1880563。 - musicinmybrain

11

bytes/bytearray是一个整数序列。如果你根据索引访问它的元素,你会得到一个整数:

>>> b'abc'
b'abc'
>>> _[0]
97

根据它们的定义,字节和字节数组中包含在range(0,256)范围内的整数。因此它们是“无符号8位整数”。


例如,我在我的服务器端代码中有以下内容:data = conn.recv(1000000)据我理解,我接收到的是字节……因此我希望将data[0]视为“无符号8位整数”。这可能吗? - bbb
这仅适用于Python 3.x。Python 2.6具有b'字符串文字'语法,但它只是str的别名,旧版本会给您一个SyntaxError。 - musicinmybrain
@musicinmybrain:这就是为什么这个问题被标记为 python-3.x 的原因吧,我猜。 - SilentGhost

7

如果您只需要第一个字节的整数值,另一个非常合理且简单的选项是以下内容:

value = ord(data[0])

如果你想一次性解包你接收到的所有元素(而它们不仅仅是一个同质数组),或者你正在处理像32位整数这样的多字节对象,那么你需要使用类似于struct模块的东西。


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