4 二進位制資料處理庫

2021-12-29 19:41:21 字數 2788 閱讀 8762

二進位制處理庫主要是針對二進位制資料的操作和使用,也有介紹一些特定的操作,比如像檔案格式和網路協議。

在前面也介紹了文字處理庫,其實有一部分功能也是能處理二進位制資料的,比如正規表示式re,或者是difflib比較庫對資料進行處理。此外,在python內部也提供了bytes/bytearray/memoryview等資料型別進行操作。

本模組主要對python的數值與c結構表示為python的bytes物件之間進行轉換。通過此模組可以處理以二進位制儲存在檔案裡的資料,也可以處理網路連線之間相互傳送的資料,或者其它**的二進位制資料。此模擬主要通過格式化字串方式來描述c結構的儲存格式,然後根據這個格式來讀取或儲存python內部表示的資料型別。

在模組struct裡,很多函式都需要使用乙個緩衝區引數,因而此緩衝區引數應實現buffer協議,並且提供讀或者讀寫的功能。大多數情況下使用bytes和bytearray都可以滿足要求,不過其它型別也有實現buffer協議,基本上都是可以檢視的功能。

本模組定義下面異常和函式功能:

exception struct.error

定義struct操作出錯異常原因,struct.error是返回乙個字串描述出錯原因。

例子:#python 3.4.3

import struct

b = 0

try:

print('測試')

struct.pack('a', b)

except struct.error as error:

print('異常出錯提示:', error)

結果輸出如下:

測試異常出錯提示: bad char in struct format

struct.pack(fmt, v1, v2, ...)

把引數v1、v2按格式fmt格式化填充到緩衝區,返回乙個bytes物件。引數的個數和型別要與格式化字串一致。

例子:#python 3.4.3

import struct

print(struct.pack('hhl', 1, 2, 3))

結果輸出如下:

b''struct.pack_into(fmt, buffer, offset, v1, v2, ...)

把引數v1,v2按格式fmt打包,並寫入緩衝區物件buffer的開始位置offset處。注意位置引數offset一定要提供。

例子:#python 3.4.3

import struct

buf = bytearray(10)

print(struct.pack_into('hhl', buf, 0, 1, 2, 3))

print(buf)

結果輸出如下:

none

bytearray(b'')

struct.unpack(fmt, buffer)

從乙個緩衝區bytes物件buffer按格式化字串進行解包,把解包出來的相應字段生成乙個元組返回。緩衝區的大小應滿足len(bytes)等於calcsize(fmt)大小。否則會丟擲異常錯誤。

例子:#python 3.4.3

import struct

buf = struct.pack('hhl', 1, 2, 3)

print(buf)

print(struct.unpack('hhl', buf))

結果輸出如下:

b''(1, 2, 3)

struct.unpack_from(fmt, buffer, offset=0)

從緩衝區buffer的指定位置offset,按格式fmt進行解包,把結果放到元組裡。要求buffer[offset:]的大小至少大於calcsize(fmt)的大小。

例子:#python 3.4.3

import struct

buf = bytearray(10)

struct.pack_into('hhl', buf, 0, 1, 2, 3)

print(buf)

tmp = struct.unpack_from('hhl', buf, 0)

print(tmp)

結果輸出如下:

bytearray(b'')

(1, 2, 3)

struct.iter_unpack(fmt, buffer)

迭代地按格式fmt來解包緩衝區buffer,要求buffer的長度剛好是格式fmt的整數倍大小,否則丟擲異常。與unpack()多次呼叫比較主要是提高解包的速度。

例子:#python 3.4.3

import struct

buf = bytearray(20)

struct.pack_into('hhl', buf, 0, 1, 2, 3)

struct.pack_into('hhl', buf, 8, 4, 5, 6)

print(buf)

btbuf = bytes(buf[0:16])

for tmp in struct.iter_unpack('hhl', btbuf):

print(tmp)

結果輸出如下:

bytearray(b'')

(1, 2, 3)

(4, 5, 6)

struct.calcsize(fmt)

計算給出格式字串fmt來計算需要緩衝區的大小。

例子:#python 3.4.3

import struct

print('hhl:', struct.calcsize('hhl'))

print('hhh:', struct.calcsize('hhh'))

結果輸出如下:

hhl: 8

hhh: 6

Python中二進位制資料處理模組struct使用

python中沒有二進位制型別,但是可以使用string字串型別來儲存二進位制資料,然後使用struct模組來對二進位制資料進行處理。下面將詳細描述如何使用struct模組來處理二進位制資料。使用struct.pack把乙個整數值打包成字串,開啟python命令列,輸入 import struct ...

python處理二進位制資料

處理二進位制資料離不開python的struct模組,struct理解上你可以把它理解為c語言的結構體,使用該模組的pack和unpack方法,可以很容易的把二進位制資料轉換為常用的型別資料,如整型 字元型等 結構體如下 struct header 將二進位制資料流解析為常用的資料型別,例如 pyt...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...