欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?Struct庫之pack和unpack舉例詳解

 更新時間:2024年02月20日 10:48:09   作者:天地神仙  
這篇文章主要給大家介紹了關于Python?Struct庫之pack和unpack的相關資料,pack和unpack在處理二進制流中比較常用的封包、解包格式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. 官網(wǎng)解析

首先是官網(wǎng)對于 pack 、 unpack 、calcsize 以及 Format Strings 的描述

1.1 pack、unpack、calcsize

struct.pack 返回一個 bytes對象,其中包含根據(jù)格式字符串 format 打包的值 v1, v2,…
參數(shù)必須與格式所要求的值完全匹配

struct.unpack 根據(jù)格式字符串 format 從緩沖區(qū) buffer (假設由pack(format,…)打包)中解包。返回一個元組,即使它只包含一個元素。緩沖區(qū)的字節(jié)大小必須與格式所需的大小匹配,如 calcsize() 所反映的那樣。

struct.calcsize 返回與格式字符串 format 對應的結(jié)構(gòu)體(以及由 pack(format,…)生成的 bytes 對象)的大小。

1.2 Format Strings

這一段在官方的描述中很詳細,同時也很長,這里我只放幾個重要的地方,剩下的可以自行去官網(wǎng)查閱

格式字符串描述打包和拆包數(shù)據(jù)時的數(shù)據(jù)布局。它們由格式字符組成,格式字符指定打包/解包的數(shù)據(jù)類型。此外,特殊字符控制字節(jié)順序、大小和對齊方式。每個格式字符串由一個可選的前綴字符(描述數(shù)據(jù)的總體屬性)和一個或多個格式字符(描述實際數(shù)據(jù)值和填充)組成。

1.2.1 字節(jié)順序、大小和對齊方式

默認情況下,C 語言的類型以機器的本機格式和字節(jié)順序表示,并在必要時通過填充字節(jié)來正確對齊(根據(jù) C 語言編譯器使用的規(guī)則)。選擇這種行為是為了使打包結(jié)構(gòu)體的字節(jié)與相應的 C 語言的結(jié)構(gòu)體的內(nèi)存布局完全對應。是使用本機字節(jié)排序和填充還是標準格式取決于應用程序。格式字符串的第一個字符可以用來指示字節(jié)順序、大小和打包數(shù)據(jù)的對齊方式,如下表所示:

1.2.2 格式字符

格式字符有以下含義:給定 C 和 Python 值的類型,它們之間的轉(zhuǎn)換應該是顯而易見的。Standard size 列是指使用Standard size時,以字節(jié)為單位的打包值的大小;也就是說,當格式字符串以 <,>,!= 開頭的時候(詳情見上面一個表格的 Size 列)。當使用 native size 時,打包值的大小取決于平臺。

2. pack 解析

pack會把給定的數(shù)據(jù)按照 format string 的方式去打包我們來看看例子

例子 1

from struct import *
print(pack(">bhl", 1, 2, 3))

這里 format string 為 >bhl,其中 > 代表采用大端(高位字節(jié)在前)的方式打包, b、h、l 分別代表采用 signed char、short、long(對于 C 語言)的數(shù)據(jù)類型來分別打包 12、3,他們分別占用 1 字節(jié)、2 字節(jié)和 4 字節(jié),下圖是運行的結(jié)果。b 開頭表示是字節(jié)類型,輸出的結(jié)果和我們分析的結(jié)果一致

例子 2

from struct import *
print(pack("<2hl", 1, 2, 3))

這里 format string 為 <2hl,其中 < 代表采用小端(低位字節(jié)在前)的方式打包, 2h 代表前面 2 個數(shù)據(jù)采用 signed short 類型、進一步的,我們可以使用 x+格式字符 來表示,后續(xù) x 個字符都用此格式字符來打包
下圖是運行的結(jié)果:b 開頭表示是字節(jié)類型,輸出的結(jié)果和我們分析的結(jié)果一致。

例子 3

注意下面代碼的運行結(jié)果

from struct import *
print(pack("@3c", b'1', b'2', b'3'))
print(pack("@1s", b'123'))
print(pack("@2s", b'123'))
print(pack("@3s", b'123'))

這一段代碼主要是 format string 的不同導致了打包的結(jié)果和入?yún)⒉煌?,其?nbsp;c 是以 char 類型去打包,3c 是代表后續(xù)的 3 個參數(shù)全部按照 char 去打包,而 s 是以 char[] 類型去打包,而 s 前面的數(shù)字則是代表打包多少位

3. unpack 解析

unpack 可以理解為是 pack 的逆向,直接看例子

例子1

from struct import *
print(unpack(">bhl",pack(">bhl", 1, 2, 3)))

將上面第一個例子的輸出作為unpack的參數(shù)輸入,然后按照和打包一樣的 format string 去進行解包我們可以得到如下的結(jié)果,與我們的輸入是一致的。

當然,在很多場景下并不是像這樣自己打包數(shù)據(jù)然后再自己解包,而是需要按照一定的協(xié)議去解來自其他地方的字節(jié)流,于是可以這樣寫,在 data 中換成需要解包的數(shù)據(jù),然后根據(jù)包的協(xié)議(字節(jié)順序、大小和對齊方式)來編寫解包的 format string

from struct import *
data = b'\x01\x00\x02\x00\x00\x00\x03'
print(unpack('>bhl', data))

總結(jié) 

到此這篇關于Python Struct庫之pack和unpack的文章就介紹到這了,更多相關Python Struct庫pack和unpack內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • pycharm運行pytest中文編碼格式錯亂解決

    pycharm運行pytest中文編碼格式錯亂解決

    這篇文章主要為大家介紹了pycharm運行pytest中文編碼格式錯亂的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • python 如何調(diào)用遠程接口

    python 如何調(diào)用遠程接口

    這篇文章主要介紹了python 如何調(diào)用遠程接口,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • python開發(fā)飛機大戰(zhàn)游戲

    python開發(fā)飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了python開發(fā)飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 分享一個常用的Python模擬登陸類

    分享一個常用的Python模擬登陸類

    這篇文章主要分享的是一個常用的Python模擬登陸類,而且可以支持cookie保存,十分的實用,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制

    Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制

    聯(lián)合分布(Joint Distribution)圖是一種查看兩個或兩個以上變量之間兩兩相互關系的可視化圖,在數(shù)據(jù)分析操作中經(jīng)常需要用到。本文將通過seaborn實現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下
    2023-02-02
  • Python獲取"3年前的今天"的日期時間問題

    Python獲取"3年前的今天"的日期時間問題

    在Python中,如何獲取"?3年前的今天"的datetime對象,本文通過實例代碼給大家詳細講解,代碼簡單易懂對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-01-01
  • Python?base64和hashlib模塊及用法詳解

    Python?base64和hashlib模塊及用法詳解

    這篇文章主要介紹了Python?base64和hashlib模塊,本文通過實例代碼介紹了base64和hashlib模塊的相關知識,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Django定時任務Django-crontab的使用詳解

    Django定時任務Django-crontab的使用詳解

    測試平臺執(zhí)行測試用例時,可以借助jenkins之類的CI/CD工具,也可以使用定時任務crontab,作為測試開發(fā)工程師,我們可能沒有權(quán)限去操作服務器,那么我們就只能使用django-crontab,在指定時間循環(huán)執(zhí)行測試用例,對定時任務Django-crontab的使用感興趣的朋友一起看看吧
    2022-07-07
  • pycharm配置Qt?Designer工具的圖文教程

    pycharm配置Qt?Designer工具的圖文教程

    本文主要介紹了pycharm配置Qt?Designer工具的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例

    Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例

    這篇文章主要為大家介紹了Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論