最近在學習python網絡編程這一塊,在寫簡單的socket通信代碼時,遇到了struct這個模塊的使用,當時不太清楚這到底有和作用,后來查閱了相關資料大概了解了,在這里做一下簡單的總結。
了解c語言的人,一定會知道struct結構體在c語言中的作用,它定義了一種結構,里面包含不同類型的數據(int,char,bool等等),方便對某一結構對象進行處理。而在網絡通信當中,大多傳遞的數據是以二進制流(binary data)存在的。當傳遞字符串時,不必擔心太多的問題,而當傳遞諸如int、char之類的基本數據的時候,就需要有一種機制將某些特定的結構體類型打包成二進制流的字符串然后再網絡傳輸,而接收端也應該可以通過某種機制進行解包還原出原始的結構體數據。python中的struct模塊就提供了這樣的機制,該模塊的主要作用就是對python基本類型值與用python字符串格式表示的C struct類型間的轉化(This module performs conversions between Python values and C structs represented as Python strings.)。stuct模塊提供了很簡單的幾個函數,下面寫幾個例子。
該模塊作用是完成Python數值和C語言結構體的Python字符串形式間的轉換。這可以用于處理存儲在文件中或從網絡連接中存儲的二進制數據,以及其他數據源。
用途: 在Python基本數據類型和二進制數據之間進行轉換
struct模塊提供了用于在字節字符串和Python原生數據類型之間轉換函數,比如數字和字符串。
模塊函數和Struct類
它除了提供一個Struct類之外,還有許多模塊級的函數用于處理結構化的值。這里有個格式符(Format specifiers)的概念,是指從字符串格式轉換為已編譯的表示形式,類似于正則表達式的處理方式。通常實例化Struct類,調用類方法來完成轉換,比直接調用模塊函數有效的多。下面的例子都是使用Struct類。
Packing(打包)和Unpacking(解包)
Struct支持將數據packing(打包)成字符串,并能從字符串中逆向unpacking(解壓)出數據。
在本例中,格式指定器(specifier)需要一個整型或長整型,一個兩個字節的string,和一個浮點數。格式符中的空格用于分隔各個指示器(indicators),在編譯格式時會被忽略。
import structimport binasciivalues = (1, 'ab'.encode('utf-8'), 2.7)s = struct.Struct('I 2s f')packed_data = s.pack(*values)print('原始值:', values)print('格式符:', s.format)print('占用字節:', s.size)print('打包結果:', binascii.hexlify(packed_data))# output
原始值: (1, b'ab', 2.7)
格式符: b'I 2s f'
占用字節: 12
打包結果: b'0100000061620000cdcc2c40'
這個示例將打包的值轉換為十六進制字節序列,用binascii.hexlify()方法打印出來。
新聞熱點
疑難解答