程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python內置庫struct

編輯:Python

目錄

struct庫簡要說明

struct方法

struct.pack()

 struct.unpack()

struct.calcsize(format:str) 

format參數的用法

字節順序/大小/對齊


struct庫簡要說明

  struct模塊提供了用於在字節字符串和Python原生數據類型之間轉換函數,比如數字和字符串,使用Python中的f.write()函數寫文件時,參數只能是字符串,操作純數字寫入時,不方便,這時候就輪到struct登場了。

        該模塊作用是完成Python數值和C語言結構體的Python字符串形式間的轉換。
這可以用於處理存儲在文件中或從網絡連接中存儲的二進制數據,以及其他數據源。

准確地講,Python沒有專門處理字節的數據類型。但由於b'str'可以表示字節,所以,字節數組=二進制str。而在C語言中,我們可以很方便地用struct、union來處理字節,以及字節和int,float的轉換。

故提供一個庫來做轉換。

struct方法

pack(format, v1, v2, ...) -> bytes 將字符串或者數字,按照format指定的格式轉換為bytes數據返回
unpack(fmt, string):返回一個元組,其中包含根據格式字符串解包的值。
calcsize(fmt):返回由格式字符串描述的結構的大小(以字節為單位)。

struct.pack()

        如下定義一個16進制字符串,將該字符串轉換為int值後,使用struct.pack()函數,按照有符號的int16類型,將數據寫入到文件中,循環寫入300次相同的數值。

import struct
a = '4FFF'
b = int(a, 16)
with open('test.bin', 'wb') as f:
for x in range(300):
f.write(struct.pack('h', b))

使用16進制編輯器查看該文件,驗證

 struct.unpack()

        struct.unpack(f'{data_num}h', f.read()),這裡注意,文件中有多少數據,fmt的格式就需要多個,返回的結果是一個元組。

import struct
data_num = 300
with open('test.bin', 'rb') as f:
print(struct.unpack(f'{data_num}h', f.read()))

struct.calcsize(format:str) 

        按format的格式計算這個格式本占用的字節數大小。

import struct
# B是1個字節,H是2個字節,I是4個字節,共7個字節
print(struct.calcsize('<BHI'))
print(struct.calcsize('h'))
print(struct.calcsize('H'))
print(struct.calcsize('i'))
print(struct.calcsize('c'))
print(struct.calcsize('b'))

format參數的用法

FormatC TypePython字節數xpad byteNone1ccharint1bsigned charint1Bunsigned charint1?Boolbool1hshortint2Hunsigned shortint2iintint4Iunsigned intint4llongint4Lunsigned longint4qlong longint8Qunsigned long longint8ffloatfloat4ddoublefloat8schar[]bytes1pchar[]bytes1Pvoid *int0

字節順序/大小/對齊

        默認情況下,pack是使用本地C庫的字節順序來編碼的。格式化字符串的第一個字符可以用來表示填充數據的字節順序、大小和對齊方式,如下表所描述的:

CharacterByte orderSizealignment@nativenative湊足4個字節=nativestandard不作變化<little-endianstandard不作變化>big-endianstandard不作變化!network (= big-endian)standard不作變化

參考:

Python使用struct庫的用法小結_python_腳本中心 - 編程客棧

Python標准庫筆記(6) — struct模塊 - 知乎


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved