Python3標準庫 struct二進位制資料結構

2022-01-20 09:48:21 字數 3923 閱讀 3607

struct模組包括一些函式,這些函式可以完成位元組串與原生python資料型別(如數字和字串)之間的轉換。

struct提供了一組處理結構值的模組級函式,另外還有乙個struct類。格式指示符將由字串格式轉換為一種編譯表示,這與處理正規表示式的方式類似。這個轉換會耗費一些資源,所以建立乙個struct例項並在這個例項上呼叫方法時(不是使用模組級函式)只完成一次轉換,這會更高效。下面的例子使用了struct類。

struct支援使用格式指示符將資料打包(packing)為字串,另外支援從字串解包(unpacking)資料,格式指示符由表示資料型別的字元和可選的數量及位元組序(endianness)指示符構成。

在下面的例子中,指示符要求有乙個整型或長整型值、乙個兩位元組字串以及乙個浮點數。格式指示符中包含的空格用來分隔型別指示符,並且在編譯格式時會被忽略。

import

struct

import

binascii

values = (1, '

ab'.encode('

utf-8

'), 2.7)

s = struct.struct('

i 2s f')

packed_data = s.pack(*values)

print('

original values:

', values)

print('

format string :

', s.format)

print('

uses :

', s.size, '

bytes')

print('

packed value :

', binascii.hexlify(packed_data))

這個例子將打包的值轉換為乙個十六進製制位元組序列,以便用binascii.hexlify()列印,因為有些字元是null。

使用unpack()可以從打包的表示中抽取資料。

import

struct

import

binascii

packed_data = binascii.unhexlify(b'

0100000061620000cdcc2c40')

s = struct.struct('

i 2s f')

unpacked_data =s.unpack(packed_data)

print('

unpacked values:

', unpacked_data)

將打包值傳入unpack(),基本上會得到相同的值(注意浮點值中的微小差別)。

預設地,值會使用原生c庫的位元組序(endianness)來編碼。只需在格式串中提供乙個顯式的位元組序指令,就可以很容易地覆蓋這個預設選擇。

import

struct

import

binascii

values = (1, '

ab'.encode('

utf-8

'), 2.7)

print('

original values:

', values)

endianness =[

('@', '

native, native'),

('=', '

native, standard'),

('<

', '

little-endian'),

('>

', '

big-endian'),

('!', '

network'),

]for code, name in

endianness:

s = struct.struct(code + '

i 2s f')

packed_data = s.pack(*values)

print

()

print('

format string :

', s.format, '

for'

, name)

print('

uses :

', s.size, '

bytes')

print('

packed value :

', binascii.hexlify(packed_data))

print('

unpacked value :

', s.unpack(packed_data))

根據下表,格式字串的第乙個字元可用於指示打包資料的位元組順序,大小和對齊方式:

字元位元組順序

大小對齊方式

@

按原位元組

按原位元組

按原位元組

=

按原位元組標準無

<

小端標準

>

大端標準

!

網路(=大端)標準無

通常在強調效能的情況下或者向擴充套件模組傳入或傳出資料時才會處理二進位制打包資料。通過避免為每個打包結構分配乙個新緩衝區所帶來的開銷,這些情況可以得到優化。pack_into()和unpack_from()方法支援直接寫入預分配的緩衝區。

import

array

import

binascii

import

ctypes

import

struct

s = struct.struct('

i 2s f')

values = (1, '

ab'.encode('

utf-8

'), 2.7)

print('

original:

', values)

print

()print('

ctypes string buffer')

b =ctypes.create_string_buffer(s.size)

print('

before :

', binascii.hexlify(b.raw))

s.pack_into(b, 0, *values)

print('

after :

', binascii.hexlify(b.raw))

print('

unpacked:

', s.unpack_from(b, 0))

print

()print('

array')

a = array.array('

b', b'

\0' *s.size)

print('

before :

', binascii.hexlify(a))

s.pack_into(a, 0, *values)

print('

after :

', binascii.hexlify(a))

print('

unpacked:

', s.unpack_from(a, 0))

struct的size屬性指出緩衝區需要有多大。

Python3標準庫 statistics統計計算

statistics模組實現了很多常用的統計公式,允許使用python的各種數值型別 int float decimal和fraction 來完成高效計算。共支援3種形式的平均值 均值 mean 中值或中位數 median 以及眾數 mode 可以用mean 計算算術平均值。from statist...

Python3標準庫學習 二

這個模組包含 python 中使用的內建函式.一般不用手動匯入這個模組 python會幫你做好一切.python允許你實時地建立函式引數列表.只要把所有的引數放入乙個元組中或者字典中 示例 如下 encoding gb2312 created on 2012 5 1 author administr...

Python3標準庫 calendar處理日期

calendar模組第一了calendar類,其中封裝了一些值的計算,如給定的乙個月或一年中的周日期。另外,textcalendar和htmlcalendar類可以生成經過預格式化的輸出。prmonth 方法是乙個簡單的函式,可以生成月的格式化文字輸出。import calendar c calen...