# #********struct模塊********# # 1.按照指定格式將Python數據轉換爲字符串,該字符串爲字節流,如網絡傳輸時, # 不能傳輸int,此時先將int轉化爲字節流,而後再發送; # 2.按照指定格式將字節流轉換爲Python指定的數據類型; # 3.處理二進制數據,若是用struct來處理文件的話,須要用’wb’,’rb’以二 # 進制(字節流)寫,讀的方式來處理文件; # 4.處理c語言中的結構體; # struct模塊中的函數 # 函數 return explain # pack(fmt,v1,v2…) string 按照給定的格式(fmt),把數據轉換成字符串(字節流),並將該字符串返回. # pack_into(fmt,buffer,offset,v1,v2…) None 按照給定的格式(fmt),將數據轉換成字符串(字節流),並將字節流寫入以offset開始的buffer中.(buffer爲可寫的緩衝區,可用array模塊) # unpack(fmt,v1,v2…..) tuple 按照給定的格式(fmt)解析字節流,並返回解析結果 # pack_from(fmt,buffer,offset) tuple 按照給定的格式(fmt)解析以offset開始的緩衝區,並返回解析結果 # calcsize(fmt) size of fmt 計算給定的格式(fmt)佔用多少字節的內存,注意對齊方式 # 當打包或者解包的時,須要按照特定的方式來打包或者解包.該方式就是格式化字符串, # 它指定了數據類型,除此以外,還有用於控制字節順序、大小和對齊方式的特殊字符. # 格式符 # 格式符 C語言類型 Python類型 Standard size # x pad byte(填充字節) no value # c char string of length 1 1 # b signed char integer 1 # B unsigned char integer 1 # ? _Bool bool 1 # h short integer 2 # H unsigned short integer 2 # i int integer 4 # I(大寫的i) unsigned int integer 4 # l(小寫的L) long integer 4 # L unsigned long long 4 # q long long long 8 # Q unsigned long long long 8 # f float float 4 # d double float 8 # s char[] string # p char[] string # P void * long # 注- -! # _Bool在C99中定義,若是沒有這個類型,則將這個類型視爲char,一個字節; # q和Q只適用於64位機器; # 每一個格式前能夠有一個數字,表示這個類型的個數,如s格式表示必定長度的字符串,4s表示長度爲4的字符串;4i表示四個int; # P用來轉換一個指針,其長度和計算機相關; # f和d的長度和計算機相關; #對齊方式 # Character Byte order Size Alignment # @(默認) 本機 本機 本機,湊夠4字節 # = 本機 標準 none,按原字節數 # < 小端 標準 none,按原字節數 # > 大端 標準 none,按原字節數 # ! network(大端) 標準 none,按原字節數 # 瞭解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類以外,還有許多模塊級的函數用於處理結構化的值。這裏有個格式符(Format specifiers)的概念, # 是指從字符串格式轉換爲已編譯的表示形式,相似於正則表達式的處理方式。一般實例化Struct類,調用類方法來完成轉換, # 比直接調用模塊函數有效的多。下面的例子都是使用Struct類。 # 好在Python提供了一個struct模塊來解決str和其餘二進制數據類型的轉換。 # struct的pack函數把任意數據類型變成字符串: import struct print(struct.pack('>I', 10240099)) #結果:b'\x00\x9c@c' # pack的第一個參數是處理指令,'>I'的意思是: # >表示字節順序是big-endian,也就是網絡序,I表示4字節無符號整數。 # 後面的參數個數要和處理指令一致。 # unpack把str變成相應的數據類型: print(struct.unpack('>I', b'\x00\x9c@c')) #結果:(10240099,)