如何将字节bytes转换为整数int

Bytes数据类型的数值范围为0~255(0x00~0xFF)。一个字节有8位数据,这就是为什么它的最大值是0xFF。在某些情况下,你需要将字节或字节数组转换为整数以进行进一步的数据处理。我们就来看如何进行字节Bytes到整数integer的转换。

Python 2.7中的字节Bytes

Python 2.7版本中没有内置的bytes数据类型。关键字bytestr是等同的。 我们可以通过下面的is判断的高处这个结论。

>>> bytes is str
True

bytearray用于定义一个bytes或一个byte array对象。

>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')

Python 2.7中将字节转换为整数

Python内部模块struct可以将二进制数据(字节)转换为整数。它可以双向转换Python 2.7中的字节(实际上是字符串)和整数 。下面就是它的一个基本介绍,

struct.unpack(fmt, string)
	Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.

struct 例子

import struct
testBytes = b'\x00\x01\x00\x02'
testResult = struct.unpack('>HH', testBytes)
print testResult
(1, 2)

格式字符串>HH包含两部分,

  1. >表示二进制数据是big-endian,或换句话说,数据是从高端(最高有效位)排序的。例如,\x00\0x1中,\x00是高字节,\x01是低字节。
  2. HH表示字节字符串中有两个H类型的对象。H表示它是unsigned short整数,占用了2个字节。

如果分配的数据格式不同,你可以从相同的字符串中得到不同的结果。

>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)

这里,<表示字节顺序是little-endian。因此\x00\x01变成00+1*256 = 256不是0*256+1 = 1了。

>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)

B表示数据类型是unsigned char,它占用了1个字节。因此,\x00\x01\x00\x02将被转换为4个unsigned char的值,而不再是2个unsigned short的值。

友情提示
格式字符串中指定的数据长度应与给定数据相同,否则将会报错。
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')

Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3

你可以查看struct模块的官方文档来获取格式字符串的更多信息。

Python 3中的字节Bytes

bytes是Python 3中的内置数据类型,因此,你可以使用bytes关键字直接来定义字节。

>>> testByte = bytes(18)
>>> type(testByte)

你也可以像下面这样直接定义一个或多个字节 。

>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)

Python 3中将字节转换为整数

除了已经在Python 2.7中引入的struct模块之外,你还可以使用新的Python 3内置整数方法来执行字节到整数的转换,即int.from_bytes()方法。

int.from_bytes() 例子

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712

byteorder选项类似于struct.unpack()字节顺序格式的定义。

The byteorder option is similar to struct.unpack() format byte order definition.

Info
字节表示将会被转换为一个整数。

int.from_bytes() 有第三个选项signed,它将整数类型赋值为signedunsigned

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824

当字节是 unsinged chart时使用[]

如果数据格式是unsigned chart且只包含一个字节,则可以直接使用对象索引进行访问来获取该整数。

>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16