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

将整型int转换为字节bytes是将字节bytes转换为整型int的逆操作,本文中介绍的大多数的intbytes的方法都是bytesint方法的反向方法。

Python 2.7和3中 intbytes 转换的通用方法

你可以使用Python struct模块中的pack函数将整数转换为特定格式的字节。

>>> import struct
>>> struct.pack("B", 2)
'\x02'
>>> struct.pack(">H", 2)
'\x00\x02'
>>> struct.pack("<H", 2)
'\x02\x00'

struct.pack函数中的第一个参数是格式字符串,它指定了字节格式比如长度,字节顺序(little/big endian)等。

Python 3中新引入的intbytes的转换方法

使用 bytes 来进行 intbytes的转换

上一篇文章中提到过,bytes是Python 3中的内置数据类型。你可以使用bytes轻松地将整数0~255转换为字节数据类型。

>>> bytes([2])
b'\x02`
友情提示

整数需要放在括号[]中,否则你得到将是占用该整数个字节位置的空字节,而不是相应的字节本身。

>>> bytes(3)
b'\x00\x00\x00'

通过 int.to_bytes() 方法将整型转换为字节类型

从Python3.1开始引入了一个引入了一个新的整数类方法int.to_bytes()。它是上一篇文章中讨论的int.from_bytes()反向转换方法。

>>> (258).to_bytes(2, byteorder="little")
b'\x02\x01'
>>> (258).to_bytes(2, byteorder="big")
b'\x01\x02'
>>> (258).to_bytes(4, byteorder="little", signed=True)
b'\x02\x01\x00\x00'
>>> (-258).to_bytes(4, byteorder="little", signed=True)
b'\xfe\xfe\xff\xff'

第一个参数是转换后的字节数据长度,第二个参数byteorder将字节顺序定义为little或big-endian,可选参数signed确定是否使用二进制补码来表示整数。

运行速度比较

Python 3中, 你有3种方法可以转换intbytes

  • bytes() 方法
  • struct.pack() 方法
  • int.to_bytes() 方法

我们将测试每种方法的执行时间以比较它们的性能,最后将会给出来提高程序运行速度的建议。

>>> import timeint
>>> timeit.timeit('bytes([255])', number=1000000)
0.31296982169325455
>>> timeit.timeit('struct.pack("B", 255)', setup='import struct', number=1000000)
0.2640925447800839
>>> timeit.timeit('(255).to_bytes(1, byteorder="little")', number=1000000)
0.5622947660224895
转换方法 执行时间(100万次)
bytes() 0.31296982169325455 s
struct.pack() 0.2640925447800839 s
int.to_bytes() 0.5622947660224895 s

因此,请使用struct.pack()函数执行来执行整型到字节的转换以获得最佳执行性能,虽然它已在Python 2分支中引入了,生姜还是老的辣!