如何在 Python 中将字节转换为整数?

2025年1月5日 | 阅读 5 分钟

字节序列可以使用 Python 的内置数据类型 `bytes` 来表示。每个字节的取值范围是 0 到 255。出于各种目的,例如解析二进制数据和执行数学计算,您可能偶尔需要将字节转换为整数。幸运的是,在 Python 中有几种方法可以将字节转换为整数。

现在,让我们深入了解细节

1. 使用 `int.from_bytes()` 方法

要在 Python 中将字节序列转换为整数,请使用 `int.from_bytes()` 函数。此函数需要的两个参数是:要转换的 `bytes` 对象和可选的字节顺序。默认情况下,它假定为大端字节序。

  • `bytes_data`:您希望将此 `bytes` 对象转换为整数。
  • `byteorder`:此选项指定 `bytes` 对象的字节顺序。'big' 或 'small' 分别表示大端或小端。在大端字节序中,最重要的字节存储在最前面;在小端字节序中,最不重要的字节存储在最前面。
  • 如果 `byteorder` 留空,则默认值为 'big'(大端)。如果您的字节是小端序,则必须指定 `byteorder='little'`。

代码

输出

15

在此,`byteorder` 参数指定了 `bytes` 对象的字节顺序,可以是 'big' 或 'little'。

2. 使用 `struct.unpack()`

Python 的 `struct` 模块提供了用于将字节解码为打包二进制数据的函数。要将字节解包为值元组,请使用 `struct.unpack()`。

  • '>H':这是一个格式字符串,表示数据是以大端字节序('>')表示的无符号短整型(2 字节)。格式字符串指定了要解包的数据的大小和字节序。H 表示无符号短整型(2 字节)。
  • 您可以根据字节的大小和字节序修改格式字符串。

代码

输出

15

在此示例中,'>H' 指定了一个大端无符号短整型(2 字节),这对应于给定的字节。

3. 使用按位运算

您还可以使用按位运算将字节转换为整数。此方法涉及移位和按位 OR 运算。

  • 代码遍历 `bytes` 对象中的每个字节。
  • 它通过将现有整数值左移 8 位来为新字节腾出空间(`integer_value << 8`)。
  • 然后,通过按位 OR 运算(`|`)将字节的值添加到整数中。

代码

输出

15

此代码逐个遍历 `bytes` 对象中的每个字节,将整数值左移八位,然后使用按位 OR 运算符将字节组合起来。

  • `bytes_data = b'\x00\x0f'`:此行创建了一个包含两个字节 00 和 0f 的 `bytes` 对象。
  • `integer_value = 0`:此行将一个整数变量 `integer_value` 初始化为 0。
  • `for byte in bytes_data:`:此循环遍历 `bytes_data` 中的每个字节。
  • `(integer_value << 8) | byte`:此表达式将 `integer_value` 的位左移 8 位(相当于乘以 256,因为 2^8 = 256),然后与当前字节进行按位 OR 运算。通过这样做,字节被有效地组合成一个单一的数字。
  • 循环完成后,字节的总整数值存储在 `integer_value` 中。在此,00 左移 8 位,然后与 0f 进行 OR 运算,得到 15。
  • `print_value(integer)`:此行打印整数值,即 15。

让我们探讨一些更高级的主题和注意事项

处理有符号整数

在处理表示有符号整数的字节时,必须考虑负数的表示。在 Python 中,可以使用 `struct.unpack()` 和 `int.from_bytes()` 函数将字节解释为有符号整数。

代码

输出

-1
  • `bytes_data = b'\xff\xff'`:此行创建了一个包含两个字节 ff 和 ff 的 `bytes` 对象。
  • `from_bytes(bytes_data, byteorder='big', signed=True)`:此行将 `bytes_data` 转换为有符号整数。由于 `byteorder='big'`,它以大端序(最高有效字节在前)解释字节。`signed=True` 参数表示整数应被解释为有符号的。
  • 字节 ff ff 在二补码表示法中表示 -1。
  • 因此,输出为 -1。

处理可变长度数据

有时,您的字节数据可能包含可变长度的字段。您需要妥善处理这些字段。

代码

输出

['abc', 'de']
  • `bytes_data = b'\x03abc\x02de'`:此代码生成了一个名为 `bytes` 的对象,其中包含信息 03abc02de。该结构由一系列可变长度的字段组成,每个字段包含一个指示其长度的字节后的数据。
  • 在循环中
  • `length = bytes_data[0]`:获取 `bytes_data` 的第一个字节,表示当前字段的长度。
  • `field_data = bytes_data[1:length+1]`:此函数从索引 1(第二个字节)开始,到 `length+1` 之前的字节结束,检索当前字段的数据。这会根据字段的长度检索字段数据。`fields.append(...)`:将提取的字段添加到 `fields` 列表中。
  • `bytes_data = bytes_data[length+1:]`:在下一次迭代中,从 `bytes_data` 中删除已处理的字段(长度字节 + 数据)。

结论

总之,在 Python 中将字节转换为整数是一个基本过程,可以根据您的需求通过多种方式完成。无论您是处理二进制数据、网络连接还是文件格式,Python 都提供了灵活的功能来有效地处理字节到整数的转换。

`int.from_bytes()` 方法易于使用且灵活,可以处理有符号整数并选择字节顺序。`struct.unpack()` 是处理可变长度字段和结构化数据格式的最佳选择,因为它允许精确控制字节解释。另一方面,按位运算提供了效率和低级控制,尤其适用于需要高性能或大型数据集的应用程序。

高级注意事项的例子包括:处理有符号数字、处理可变长度数据、优化效率、为网络通信保持字节顺序一致性以及进行可靠的错误处理以优雅地处理意外数据。

通过了解这些技术和注意事项,您可以创建 Python 代码,有效地将字节转换为整数,以满足各种应用程序的需求,同时保持健壮性、效率和可靠性。