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