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模塊提供了很簡單的幾個函數,下面寫幾個例子。html

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

用途: 在Python基本數據類型和二進制數據之間進行轉換正則表達式

 

struct模塊提供了用於在字節字符串和Python原生數據類型之間轉換函數,好比數字和字符串。網絡

 

模塊函數和Struct類socket

它除了提供一個Struct類以外,還有許多模塊級的函數用於處理結構化的值。這裏有個格式符(Format specifiers)的概念,是指從字符串格式轉換爲已編譯的表示形式,相似於正則表達式的處理方式。一般實例化Struct類,調用類方法來完成轉換,比直接調用模塊函數有效的多。下面的例子都是使用Struct類。函數

Packing(打包)和Unpacking(解包)spa

Struct支持將數據packing(打包)成字符串,並能從字符串中逆向unpacking(解壓)出數據。orm

在本例中,格式指定器(specifier)須要一個整型或長整型,一個兩個字節的string,和一個浮點數。格式符中的空格用於分隔各個指示器(indicators),在編譯格式時會被忽略。htm

 

  1. struct模塊中最重要的二個函數是pack(), unpack():對象

    (1)打包:struct.pack(fmt, v1, v2, …)

    (2)解包:struct.unpack(fmt, buffer)

  2.  

    struct中支持的格式字符(fmt)以下表。

    python中的struct模塊怎麼使用
  3.  

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

    或者,根據下表,格式字符串的第一個字符可用於指示打包數據的字節順序,大小和對齊。使用方法是放在fmt的第一個位置,就像'@5s5sif'。

舉例理解1:

 
  1. 1

    好比有一個C結構體。

    python中的struct模塊怎麼使用
  2. 2

    解包。經過socket.recv接收到了一個上面的結構體數據,存在字符串buffer中,如今須要把它解析出來,可使用unpack()函數:id, name = struct.unpack("!ic", buffer)。上面的格式字符串中,!表示咱們要使用網絡字節順序解析,由於咱們的數據是從網絡中接收到的,在網絡上傳送的時候它是網絡字節順序的。後面的i表示 一個int的id,c表示一個char的name。

  3. 3

    打包。就經過一個unpack,如今id, name裏已經保存好咱們的信息了。一樣,也能夠很方便的把本地數據再pack成struct格式。buffer = struct.pack("!ic", id, name)。pack函數就把id, name按照指定的格式轉換成告終構體,buffer 如今是一個字符串(其實是相似於c結構體的字節流),能夠經過 socket.send(buffer )把這個字符串發送出去.

    END

舉例理解2:

 
  1.  

    多數據構成。以下圖

    python中的struct模塊怎麼使用
    python中的struct模塊怎麼使用
  2. 2

    分析。此時的binary就是二進制形式的數據了,能夠直接寫入文件好比 file.write(binary)。而後,當咱們須要時能夠再讀出來,binary=file.read()。也能夠經過struct.unpack()解碼成python變量,a,b,c,d=struct.unpack('5s5sif',binary),'5s5sif'這個叫作fmt,就是格式字符串,由數字加字符構成,5s表示佔5個字符的字符串,i表示整數,f表示浮點數。

相關文章
相關標籤/搜索