如何將整型 int 轉換為位元組 bytes

Jinku Hu 2023年1月30日 2018年2月14日
  1. Python 2.7 和 3 中 intbytes 轉換的通用方法
  2. Python 3 中新引入的 intbytes 的轉換方法
  3. 執行速度比較
如何將整型 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 中引入了,生薑還是老的辣!

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - Python Bytes