python struct模塊

▶函數和異常
此模塊定義了下列異常和函數:html

•exception struct.error
會在多種場合下被引起的異常;其參數爲一個描述錯誤信息的字符串。python

•struct.pack(format, v1, v2, ...)
返回一個 bytes 對象,其中包含根據格式字符串 format 打包的值 v1, v2, ... 參數個數必須與格式字符串所要求的值徹底匹配。網絡

•struct.pack_into(format, buffer, offset, v1, v2, ...)
根據格式字符串 format 打包 v1, v2, ... 等值並將打包的字節串寫入可寫緩衝區 buffer 從 offset 開始的位置。 請注意 offset 是必需的參數。函數

•struct.unpack(format, buffer)
根據格式字符串 format 從緩衝區 buffer 解包(假定是由 pack(format, ...) 打包)。 結果爲一個元組,即便其只包含一個條目。
緩衝區的字節大小必須匹配格式所要求的大小,如 calcsize() 所示。佈局

•struct.unpack_from(format, buffer, offset=0)
對 buffer 從 offset 開始的位置根據格式字符串 format 進行解包。 結果爲一個元組,即便其只包含一個條目。 緩衝區的字節大小減去
offset 必須匹配格式所要求的大小,如 calcsize() 所示。編碼

•struct.iter_unpack(format, buffer)code

根據格式字符串 format 交互式地從緩衝區 buffer 解包。 此函數返回一個迭代器,它將從緩衝區讀取相同大小的塊直至其內容所有耗盡。
緩衝區的字節大小必須整數倍于格式所要求的大小,如 calcsize() 所示。
每次迭代將產生一個如格式字符串所指定的元組。orm

▶3.4 新版功能.
struct.calcsize(format)
返回與格式字符串 format 相對應的結構的大小(亦即 pack(format, ...) 所產生的字節串對象的大小)。htm

 

▶格式字符串
格式字符串是用來在打包和解包數據時指定預期佈局的機制。 它們使用指定被打包/解包數據類型的 格式字符 進行構建。
此外,還有一些特殊字符用來控制 字節順序,大小和對齊方式。對象

字節順序,大小和對齊方式
默認狀況下,C類型以機器的本機格式和字節順序表示,並在必要時經過跳過填充字節進行正確對齊(根據C編譯器使用的規則)。

或者,根據下表,格式字符串的第一個字符可用於指示打包數據的字節順序,大小和對齊方式:

•若是第一個字符不是其中之一,則假定爲 '@' 。

•本機字節順序可能爲大端或是小端,取決於主機系統的不一樣。 例如, Intel x86 和 AMD64 (x86-64) 是小端的;Motorola 68000 和 PowerPC G5 是大端的;ARM 和 Intel Itanium 具備可切換的字節順序(雙端)。 請使用 sys.byteorder 來檢查你的系統字節順序。

•本機大小和對齊方式是使用 C 編譯器的 sizeof 表達式來肯定的。 這老是會與本機字節順序相綁定。
•標準大小僅取決於格式字符;

•請注意 '@' 和 '=' 之間的區別:兩個都使用本機字節順序,但後者的大小和對齊方式是標準化的。

•格式 '!' 適合給那些宣稱他們記不得網絡字節順序是大端仍是小端的可憐人使用。

•沒有什麼方式能指定非本機字節順序(強制字節對調);請正確選擇使用 '<' 或 '>'。

•註釋:,
1,填充只會在連續結構成員之間自動添加。 填充不會添加到已編碼結構的開頭和末尾。
2,當使用非本機大小和對齊方式即 '<', '>', '=', and '!' 時不會添加任何填充。
3,要將結構的末尾對齊到符合特定類型的對齊要求,請以該類型代碼加劇復計數的零做爲格式結束。

 

▶格式字符
格式字符具備如下含義;C 和 Python 值之間的按其指定類型的轉換應當是至關明顯的。 ‘標準大小’列是指當使用標準大小時以字節表示的已打包值大小;
也就是當格式字符串以 '<', '>', '!' 或 '=' 之一開頭的狀況。 當使用本機大小時,已打包值的大小取決於具體的平臺。

•在 3.3 版更改: 增長了對 'n' 和 'N' 格式的支持
•在 3.6 版更改: 添加了對 'e' 格式的支持。

註釋:

1,'?' 轉換碼對應於 C99 定義的 _Bool 類型。 若是此類型不可用,則使用 char 來模擬。 在標準模式下,它老是以一個字節表示。

2,'q' 和 'Q' 轉換碼僅當平臺的 C 編譯器支持 C long long 或 Windows 上的 __int64 時纔在本機模式下可用。 它們在標準模式下老是可用。

3,當嘗試使用任何整數轉換碼打包一個非整數時,若是該非整數具備 __index__() 方法,則會在打包以前調用該方法將參數轉換爲一個整數。
在 3.2 版更改: 爲非整數使用 __index__() 方法是 3.2 版的新增特性。

4,'n' 和 'N' 轉換碼僅對本機大小可用(選擇爲默認或使用 '@' 字節順序字符)。 對於標準大小,你可使用適合你的應用的任何其餘整數格式。

5,對於 'f', 'd' 和 'e' 轉換碼,打包表示形式將使用 IEEE 754 binary32, binary64 或 binary16 格式 (分別對應於 'f', 'd' 或 'e'),不管平臺使用何種浮點格式。

6,'P' 格式字符僅對本機字節順序可用(選擇爲默認或使用 '@' 字節順序字符)。 字節順序字符 '=' 選擇使用基於主機系統的小端或大端排序。
struct 模塊不會將其解讀爲本機排序,所以 'P' 格式將不可用。

7,IEEE 754 binary16 "半精度" 類型是在 IEEE 754 標準 的 2008 修訂版中引入的。 它包含一個符號位,5 個指數位和 11 個精度位(明確存儲 10 位),
能夠徹底精確地表示大體範圍在 6.1e-05 和 6.5e+04 之間的數字。 此類型並不被 C 編譯器普遍支持:在一臺典型的機器上,可使用 unsigned short 進行存儲,
但不會被用於數學運算。 格式字符以前能夠帶有整數重複計數。 例如,格式字符串 '4h' 的含義與 'hhhh' 徹底相同。

•格式之間的空白字符會被忽略;可是計數及其格式字符中不可有空白字符。

•對於 's' 格式字符,計數會被解析爲字節的長度,而不是像其餘格式字符那樣的重複計數;例如,'10s' 表示一個 10 字節的字節串,而 '10c' 表示 10 個字符。
若是未給出計數,則默認值爲 1。 對於打包操做,字節串會被適當地截斷或填充空字節以符合要求。 對於解包操做,結果字節對象老是剛好具備指定數量的字節。
做爲特殊狀況,'0s' 表示一個空字符串(而 '0c' 表示 0 個字符)。

•當使用某一種整數格式 ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q') 打包值 x 時,若是 x 在該格式的有效範圍以外則將引起 struct.error。

•在 3.1 版更改: 在 3.0 中,某些包裝了超範圍值的整數格式會引起 DeprecationWarning 而不是 struct.error。

•'p' 格式字符用於編碼「Pascal 字符串」,即存儲在由計數指定的 固定長度字節 中的可變長度短字符串。 所存儲的第一個字節爲字符串長度或 255 中的較小值。
以後是字符串對應的字節。 若是傳入 pack() 的字符串過長(超過計數值減 1),則只有字符串前 count-1 個字節會被存儲。 若是字符串短於 count-1,
則會填充空字節以使得剛好使用了 count 個字節。 請注意對於 unpack(),'p' 格式字符會消耗 count 個字節,但返回的字符串永遠不會包含超過 255 個字節。

•對於 '?' 格式字符,返回值爲 True 或 False。 在打包時將會使用參數對象的邏輯值。 以本機或標準 bool 類型表示的 0 或 1 將被打包,任何非零值在解包時將爲 True。

 

★使用例:
import struct
import binascii
import ctypes

values1 = (1, 'abc'.encode('utf-8'), 2.7)
values2 = ('defg'.encode('utf-8'),101)
s1 = struct.Struct('I3sf')
s2 = struct.Struct('4sI')
解釋:元組數據 (1, 'abc'.encode('utf-8'), 2.7),包含int、string、float三種數據類型,而後定義了struct對象,
並制定了format‘I3sf’,I 表示int,3s表示三個字符長度的字符串,f 表示 float。

print(s1.size,s2.size)
prebuffer=ctypes.create_string_buffer(s1.size+s2.size)
print('Before : ',binascii.hexlify(prebuffer))
# t=binascii.hexlify('asdfaf'.encode('utf-8'))
# print(t)


s1.pack_into(prebuffer,0,*values1)
s2.pack_into(prebuffer,s1.size,*values2)

print('After pack',binascii.hexlify(prebuffer))
print(s1.unpack_from(prebuffer,0))
print(s2.unpack_from(prebuffer,s1.size))

s3=struct.Struct('ii')
s3.pack_into(prebuffer,0,123,123)
print('After pack',binascii.hexlify(prebuffer))
print(s3.unpack_from(prebuffer,0))

參考:https://docs.python.org/3/library/struct.html

相關文章
相關標籤/搜索