python struct 官方文档
from python3.6
7.1。struct-解釋字節打包二進制數據
源代碼: Lib / struct.py
此模塊在Python值和表示為Python bytes對象的C結構之間執行轉換。除其他來源外,它可用于處理存儲在文件中或來自網絡連接的二進制數據。它使用 格式字符串作為C結構布局的緊湊描述以及與Python值之間的預期轉換
注意:默認情況下,打包給定C結構的結果包括填充字節,以維護所涉及C類型的正確對齊;同樣,拆箱時也要考慮對齊方式。選擇此行為是為了使打包結構的字節與對應的C結構的內存中的布局完全對應。要處理與平臺無關的數據格式或忽略隱式填充字節,請使用standard大小和對齊方式,而不是 native大小和對齊方式:有關詳細信息,請參見字節順序,大小和對齊方式。
幾個struct函數(和的方法Struct)采用一個緩沖區 參數。這是指實現緩沖區協議并提供可讀或可寫緩沖區的對象。用于此目的的最常見類型是bytes和bytearray,但是可以看作字節數組的許多其他類型實現了緩沖區協議,因此可以讀取/填充它們,而無需從bytes對象進行其他復制。
7.1.1。功能和異常
該模塊定義了以下異常和功能:
異常struct.error
在各種情況下都會出現例外;參數是描述錯誤的字符串。
struct.pack(fmt,v1,v2,… )
返回一個字節對象,其中包含根據格式字符串fmt打包的值v1,v2,… 。參數必須與格式所需的值完全匹配。
struct.pack_into(fmt,buffer,offset,v1,v2,… )
包值V1,V2,…按照格式字符串格式化并寫入壓縮字節到讀寫緩存緩沖區開始的位置偏移。請注意,offset是必需的參數。
struct.unpack(fmt,buffer )
根據格式字符串fmt從緩沖區緩沖區(可能由打包)解壓縮。結果是一個元組,即使它只包含一個項目。緩沖區的大小(以字節為單位)必須與格式要求的大小匹配,如所反映。pack(fmt, …)calcsize()
struct.unpack_from(fmt,buffer,offset = 0 )
根據格式字符串fmt從位置偏移量開始從緩沖區解壓縮。結果是一個元組,即使它只包含一個項目。緩沖區的大小(以字節為單位)減去偏移量,必須至少為格式要求的大小,如所反映。calcsize()
struct.iter_unpack(fmt,buffer )
根據格式字符串fmt迭代地從緩沖區緩沖區中解包。該函數返回一個迭代器,該迭代器將從緩沖區讀取大小相等的塊,直到其所有內容都被消耗為止。緩沖區的大小(以字節為單位)必須是格式要求的大小的倍數,如所反映。calcsize()
每次迭代都會產生一個由格式字符串指定的元組。
3.4版的新功能。
struct.calcsize(fmt )
返回對應于格式字符串fmt的結構(以及由此產生的bytes對象)的大小 。pack(fmt, …)
7.1.2。格式字符串
格式字符串是用于在打包和拆包數據時指定預期布局的機制。它們是由“ 格式字符”構建的,“ 格式字符”指定要打包/解壓縮的數據的類型。此外,還有一些特殊字符可用于控制字節順序,大小和對齊方式。
7.1.2.1。字節順序,大小和對齊方式
默認情況下,C類型以機器的本機格式和字節順序表示,并在必要時通過跳過填充字節來正確對齊(根據C編譯器使用的規則)。
或者,根據下表,格式字符串的第一個字符可用于指示打包數據的字節順序,大小和對齊方式:
如果第一個字符不是其中一個,’@'則假定為。
本地字節順序為大端或小端,具體取決于主機系統。例如,Intel x86和AMD64(x86-64)是低位字節序;摩托羅拉68000和PowerPC G5是大端的。ARM和Intel Itanium具有可切換的字節序(bi-endian)。使用sys.byteorder來檢查你的系統的字節序。
原始大小和對齊方式是使用C編譯器的sizeof表達式確定的 。這始終與本機字節順序結合在一起。
標準尺寸僅取決于格式字符;請參閱“ 格式字符”部分中的表。
需要注意的區別’@‘和’=’:都使用本地字節順序,但后者的大小和排列是標準化的。
該表格’!'適用于那些聲稱自己不記得網絡字節順序是大端還是小端的可憐人。
無法指示非本機字節順序(強制字節交換)。使用’<‘或的適當選擇’>’。
筆記:
1、僅在連續的結構成員之間自動添加填充。在編碼結構的開頭或結尾不添加填充。
2、使用非本機大小和對齊方式(例如,使用’<’,’>’,’=‘和’!’)時,不添加填充。
3、要將結構的末尾與特定類型的對齊要求對齊,請使用該類型的代碼結束該格式,并重復計數為零。參見示例。
7.1.2.2。格式化字符
格式字符具有以下含義;給定它們的類型,C和Python值之間的轉換應該顯而易見。“標準大小”列是指使用標準大小時打包值的大小,以字節為單位;也就是說,當格式字符串中的一個開始’<’,’>’,’!'或 ‘=’。使用本機大小時,打包值的大小取決于平臺。
在版本3.3中進行了更改:添加了對’n’和’N’格式的支持。
在版本3.6中更改:添加了對該’e’格式的支持。
筆記:
的’?'轉換碼對應于_Bool由C99定義的類型。如果此類型不可用,則使用進行模擬char。在標準模式下,它始終由一個字節表示。
將’q’和’Q’只有在平臺C編譯器支持C轉換代碼在本地模式中可用,或者在Windows上, 。它們始終在標準模式下可用。long long__int64
嘗試使用任何整數轉換代碼打包非整數時,如果非整數具有__index__()方法,則在打包之前將調用該方法以將參數轉換為整數。
在版本3.2中進行了更改:index()非整數方法的使用是3.2中的新增功能。
‘n’和’N’轉換碼只適用于本機的大小(選擇為默認或與’@'字節順序字符)。對于標準大小,可以使用適合您的應用程序的任何其他整數格式。
對于’f’,'d’和’e’轉換碼,填充表示使用IEEE 754 binary32,binary64或binary16格式( ‘f’,'d’或’e’分別地),而不管由所述平臺中使用的浮點格式的。
該’P’格式字符僅適用于本地字節順序(選擇為默認或與’@‘字節順序字符)。字節順序字符’='選擇基于主機系統使用小端或大端順序。struct模塊不會將其解釋為本地順序,因此’P’格式不可用。
在2008年修訂的IEEE 754標準中引入了IEEE 754 binary16“半精度”類型。它具有符號位,5位指數和11位精度(顯式存儲了10位),并且可以表示介于大約6.1e-05和6.5e+04 全精度之間的數字。這種類型不受C編譯器的廣泛支持:在典型的計算機上,無符號的short可以用于存儲,但不能用于數學運算。有關更多信息,請參見半精度浮點格式的Wikipedia頁面。
格式字符前面可以有整數重復計數。例如,格式字符串的’4h’含義與完全相同’hhhh’。
格式之間的空白字符將被忽略;計數及其格式不能包含空格。
對于’s’格式字符,該計數被解釋為字節的長度,而不是像其他格式字符一樣的重復計數。例如, '10s’表示一個10字節的字符串,而’10c’表示10個字符。如果未提供計數,則默認為1。對于打包,將適當地將字符串截斷或填充空字節以使其適合。對于解壓縮,生成的bytes對象始終具有完全指定的字節數。作為特殊情況,'0s’表示單個空字符串(而 '0c’表示0個字符)。
當包裝一個值x使用的整數格式之一(‘b’, ‘B’,‘h’,‘H’,‘i’,‘I’,‘l’,‘L’, ‘q’,‘Q’),如果x是外界該格式,則有效范圍struct.error上升。
在3.1版中進行了更改:在3.0 版中,某些整數格式包裝了超出范圍的值并引發DeprecationWarning而不是struct.error。
的’p’格式字符編碼“帕斯卡串”,意思是存儲在一個很短的可變長度的字符串的固定數目的字節,由計數給出。存儲的第一個字節是字符串的長度或255,以較小者為準。字符串的字節。如果傳入的字符串 pack()太長(大于計數減1),則僅count-1存儲該字符串的前導 字節。如果字符串短于count-1,則用空字節填充該字符串 ,以便使用所有字節中的精確計數字節。請注意,對于unpack(),'p’格式字符占用 count字節,但返回的字符串絕不能包含超過255個字節。
對于’?'格式字符,返回值為True或 False。打包時,將使用參數對象的真值。本機或標準布爾表示形式中的0或1都將被打包,并且True在拆包時將包含任何非零值。
7.1.2.3。例子
注意:所有示例均假定本機字節順序,大小以及與big-endian機器的對齊方式。
打包/解包三個整數的基本示例:
可以通過將未打包的字段分配給變量或將結果包裝在一個命名的元組中來命名它們:
格式字符的順序可能會影響大小,因為滿足對齊要求所需的填充不同:
pack('ci', b'*', 0x12131415) # b'*\x00\x00\x00\x12\x13\x14\x15' pack('ic', 0x12131415, b'*') # b'\x12\x13\x14\x15*' calcsize('ci') # 8 calcsize('ic') # 5下面的格式’llh0l’在末尾指定兩個填充字節,假設長整數在4字節邊界上對齊:
pack('llh0l', 1, 2, 3) # b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'這僅在原始大小和對齊方式有效時起作用;標準尺寸和對齊方式不會強制執行任何對齊方式。
也可以看看
模組 array
同類數據的打包二進制存儲。
模組 xdrlib
XDR數據的打包和拆包。
7.1.3。類
該struct模塊還定義了以下類型:
類struct.Struct(格式)
返回一個新的Struct對象,該對象根據格式字符串format寫入和讀取二進制數據。一次創建一個Struct對象并調用其方法比struct以相同格式調用函數更有效,因為格式字符串只需要編譯一次。
編譯的Struct對象支持以下方法和屬性:
pack(v1,v2,… )
與pack()函數相同,使用編譯格式。(len(result)等于)size。
pack_into(buffer,offset,v1,v2,… )
與pack_into()函數相同,使用編譯格式。
unpack(緩沖區)
與unpack()函數相同,使用編譯格式。緩沖區的大小(以字節為單位)必須等于size。
unpack_from(buffer,offset = 0 )
與unpack_from()函數相同,使用編譯格式。以字節為單位的緩沖區大小(減去偏移量)必須至少為 size。
iter_unpack(緩沖區)
與iter_unpack()函數相同,使用編譯格式。緩沖區的大小(以字節為單位)必須是的倍數size。
3.4版的新功能。
format
用于構造此Struct對象的格式字符串。
size
pack()對應于的結構體(以及由此方法產生的字節對象)的計算大小format。
總結
以上是生活随笔為你收集整理的python struct 官方文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python struct.pack()
- 下一篇: \x49\x51\x5a\x56\x54