1. 程式人生 > >淺析Python中的struct模組(python網路程式設計)

淺析Python中的struct模組(python網路程式設計)

最近在學習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模組提供了很簡單的幾個函式,下面寫幾個例子。

1、基本的pack和unpack

    struct提供用format specifier方式對資料進行打包和解包(Packing and Unpacking)。例如:

1 2 3 4 5 6 7 8 9 10 11 12 import struct import binascii values = (1, 'abc', 2.7) s = struct.Struct('I3sf') packed_data = s.pack(*values)
unpacked_data = s.unpack(packed_data) print 'Original values:', values print 'Format string :', s.format print 'Uses :', s.size, 'bytes' print 'Packed Value :', binascii.hexlify(packed_data) print 'Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data

輸出:

Original values: (1, 'abc', 2.7) 
Format string : I3sf 
Uses : 12 bytes 
Packed Value : 0100000061626300cdcc2c40 
Unpacked Type : <type 'tuple'>  Value: (1, 'abc', 2.700000047683716)

程式碼中,首先定義了一個元組資料,包含int、string、float三種資料型別,然後定義了struct物件,並制定了format‘I3sf’,I 表示int,3s表示三個字元長度的字串,f 表示 float。最後通過struct的pack和unpack進行打包和解包。通過輸出結果可以發現,value被pack之後,轉化為了一段二進位制位元組串,而unpack可以把該位元組串再轉換回一個元組,但是值得注意的是對於float的精度發生了改變,這是由一些比如作業系統等客觀因素所決定的。打包之後的資料所佔用的位元組數與C語言中的struct十分相似。定義format可以參照官方api提供的對照表:

image

2、位元組順序

   另一方面,打包的後的位元組順序預設上是由作業系統的決定的,當然struct模組也提供了自定義位元組順序的功能,可以指定大端儲存、小端儲存等特定的位元組順序,對於底層通訊的位元組順序是十分重要的,不同的位元組順序和儲存方式也會導致位元組大小的不同。在format字串前面加上特定的符號即可以表示不同的位元組順序儲存方式,例如採用小端儲存 s = struct.Struct(‘<I3sf’)就可以了。官方api library 也提供了相應的對照列表:

image

3、利用buffer,使用pack_into和unpack_from方法

  使用二進位制打包資料的場景大部分都是對效能要求比較高的使用環境。而在上面提到的pack方法都是對輸入資料進行操作後重新建立了一個記憶體空間用於返回,也就是說我們每次pack都會在記憶體中分配出相應的記憶體資源,這有時是一種很大的效能浪費。struct模組還提供了pack_into() 和 unpack_from()的方法用來解決這樣的問題,也就是對一個已經提前分配好的buffer進行位元組的填充,而不會每次都產生一個新物件對位元組進行儲存。

1 2 3 4 5 6 7 8 9 10 11 12 import struct import 

相關推薦

淺析Pythonstruct模組(python網路程式設計)

最近在學習python網路程式設計這一塊,在寫簡單的socket通訊程式碼時,遇到了struct這個模組的使用,當時不太清楚這到底有和作用,後來查閱了相關資料大概瞭解了,在這裡做一下簡單的總結。     瞭解c語言的人,一定會知道struct結構體在c語

pythonmultiprocessing模組之Pipe管道

原文地址,本文在原文基礎上添加了部分註釋。 multiprocessing.Pipe([duplex]) 方法返回2個連線物件(conn1, conn2),代表管道的兩端,預設duplex為True,是雙向通訊。如果duplex為False,則conn1只能用來接收訊息,conn2只能用來

[Python開發]Pythonstruct.pack()和struct.unpack()用法詳細說明

python中的struct主要是用來處理C結構資料的,讀入時先轉換為Python的字串型別,然後再轉換為Python的結構化型別,比如元組(tuple)啥的~。一般輸入的渠道來源於檔案或者網路的二進位制流。   1.struct.pack()和struct.unpack() 在轉化

pythonos模組的作用

簡介 OS模組簡單的來說它是一個Python的系統程式設計的操作模組,可以處理檔案和目錄這些我們日常手動需要做的操作。如果你希望你的程式能夠與平臺無關的話,這個模組是尤為重要的。 常用函式和變數 os.sep可以取代作業系統特定的路徑分隔符。windows下為 “\” os.

Learning-Python【29】:網路程式設計之粘包

粘包問題   上一篇部落格遺留了一個問題,在接收的最大位元組數設定為 1024 時,當接收的結果大於1024,再執行下一條命令時還是會返回上一條命令未執行完成的結果。這就是粘包問題。   因為TCP協議又叫流式協議,每次傳送給客戶端的資料實際上是傳送到客戶端所在作業系統的快取上,客戶端就是一個應用程式,需

PythonMatplotlib模組的簡單使用

目錄 Matplotlib pyplot類 pyplot.plot() 配置屬性 pyplot.subplot() Matplotlib Matplotlib 是 Python 2D 繪圖領域使用最廣泛的套件。它能讓使用者很輕鬆地將資料圖形化,並且提供多樣化的輸出格式

PythonNumpy模組的使用

目錄 NumPy ndarray物件 Numpy資料型別 Numpy陣列屬性 NumPy NumPy(Numerical Python) 是 Python 的一個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。Nupmy可用來儲存和處

python 協程及socket網路程式設計

協程 什麼是協程 協程,英文Coroutines,是一種比執行緒更加輕量級的存在。正如一個程序可以擁有多個執行緒一樣,一個執行緒也可以擁有多個協程。 最重要的是,協程不是被作業系統核心所管理,而完全是由程式所控制(也就是在使用者態執行)。 這樣帶來的好處就是效能得到了很大的提升,不會

Python Wxpy模組以及其監控

概述:   本文主要分享一下博主在學習wxpy 的過程中開發的一個小程式。博主在最近有一個監控報警的需求需要完成,然後剛好在學習wxpy 這個東西,因此很巧妙的將工作和學習聯絡在一起。   博文中主要使用到的技術設計到Python,Redis,以及Java。涉及到的技術看

Pythonlogging模組

1、日誌級別 日誌級別 數值 Critical 50 Error 40 Warning 30 Info 20

Pythonshodan模組的使用

關於shodan的安裝和使用,傳送門——> 滲透測試之Shodan的安裝和使用 常用 Shodan 庫函式 shodan.Shodan(key) :初始化連線API Shodan.count(query, facets=None):返回查詢結果數量

python 歷險記(五)—— python 模組

目錄 前言 基礎 模組化程式設計 模組化有哪些好處? 什麼是 python 中的模組? 引入模組有幾種方式? 模組的查詢順序 模組中包含執行語句的情況 用 dir() 函式來窺探模組 python 的內建模組有哪些? 結語 參考文件

pythonsocket模組詳解

socket模組簡介 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。socket通常被叫做“套接字”,用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計算機之間的通訊。在Internet上的主機一般運行了多個服務

pythonconfigparser模組的使用

configparser模組用於生成和修改常見配置文件,當前模組的名稱在 python 3.x 版本中變更為 configparser。 首先要寫一個如下所示的配置檔案: [DEFAULT] serveraliveinterval = 45 compression = yes c

Python json模組基礎功能小結

json支援的資料型別:int, bool, str, list, dict, Null;不支援的資料型別有:set,函式等; json 的優勢,相對其他序列化資料模組,json將資料序列化為字元存入檔案後的內容易讀易懂,且可以和通行很多語言互動資料,給不同語言的程式設計師之間互通資料提供了極大的便利性;

Pythonxlrd模組使用

安裝xlrd 該模組需要自行安裝,直接使用pip安裝就能安裝 簡單使用 測試使用的表格 1、開啟表格檔案並獲取所有sheet名稱 >>> rb = xlrd.open_workbook(r'E:\py-test\tests.xls') >>

Pythoncollections模組的用法

在內建資料型別(dict、list、set、tuple)的基礎上,collections模組提供了幾個額外的資料型別: namedtuple:生成可以使用名字來訪問元素內容的tuple,通常用來增強程式碼的可讀性, 在訪問一些tuple型別的資料時尤其好用. deque

Pythoninspect模組的一些認識

學習python時遇到了inspect模組的使用,不甚瞭解,在此簡要的認識一下。 inspect模組主要提供了四種用處: 對是否是模組,框架,函式等進行型別檢查。 獲取原始碼 獲取類或函式的引數資訊 解析堆疊 這裡我不詳細的敘述這四種用法,噹噹講一

Python的多執行緒程式設計,執行緒安全與鎖(一) 聊聊Python的GIL 聊聊Python的GIL python基礎之多執行緒鎖機制 python--threading多執行緒總結 Python3入門之執行緒threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n

python seaborn 模組畫熱度圖

https://seaborn.pydata.org/generated/seaborn.heatmap.html#seaborn.heatmap   使用seaborn這個模組畫熱度圖,其中mask引數決定了畫那一塊兒。mask矩陣的大小和資料矩陣的大小是一直的,其中0表示fal