【问题标题】:Convert Python byte to "unsigned 8 bit integer"将 Python 字节转换为“无符号 8 位整数”
【发布时间】:2009-12-11 11:38:47
【问题描述】:

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

【问题讨论】:

  • 如果你愿意依赖numpy,它们的一些函数需要一个dtype arg,你可以设置为numpy.uint8。示例:bytestream = numpy.fromfile(infile, dtype=numpy.uint8)

标签: python python-3.x


【解决方案1】:

使用struct 模块。

import struct
value = struct.unpack('B', data[0])[0]

请注意,unpack 总是返回一个元组,即使您只解包一项。

另外,看看this SO question

【讨论】:

  • 那么 struct.unpack('B', data[0])[1] 中存储了什么?
  • data[0] 是您收到的第一个字节。 unpack("B", data[0]) 将该字节视为 8 位无符号整数(在 C 中称为 unsigned char)并返回一个包含该整数的元组(如果您传递两个字节来解包,您将执行类似解包的操作("BB", data[0:2]) 并返回一个 2 元组)。最后的 [0] 获取元组中的第一个(也是唯一一个)项目。
  • 在这种情况下,它是一个只有一个元素的元组,因此 struct.unpack('B', data[0])[1] 将引发 IndexError。 [stackoverflow.com/questions/1879914/… 是 struct 的典型使用示例。
【解决方案2】:

bytes/bytearray 是一个整数序列。如果你只是通过索引访问一个元素,你会得到一个整数:

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

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

【讨论】:

  • 例如,我在我的服务器端代码 data = conn.recv(1000000) 中有这个,只要我知道我收到字节......所以我希望 data[0] 被视为“无符号 8 位整数”。这怎么可能?
  • 这仅适用于 Python 3.x。 Python 2.6 有 b'string literal' 语法,但它只是 str 的别名,旧版本会给你一个 SyntaxError。
  • @musicinmybrain:这就是为什么这个问题被标记为python-3.x我猜
【解决方案3】:

另一个非常合理和简单的选择,如果您只需要第一个字节的整数值,则如下所示:

value = ord(data[0])

如果您想一次解压接收到的数据的所有元素(并且它们不仅仅是一个同构数组),或者如果您正在处理多字节对象,例如 32 位整数,那么您需要使用类似结构模块的东西。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多