如何將位元組 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