最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 官網解析

首先是官網對于 pack 、 unpack 、calcsize 以及 Format Strings 的描述

1.1 pack、unpack、calcsize

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

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

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

1.2 Format Strings

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

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

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

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

1.2.2 格式字符

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

2. pack 解析

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

例子 1

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

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

例子 2

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

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

例子 3

注意下面代碼的運行結果

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 的不同導致了打包的結果和入參不同,其中 c 是以 char 類型去打包,3c 是代表后續(xù)的 3 個參數全部按照 char 去打包,而 s 是以 char[] 類型去打包,而 s 前面的數字則是代表打包多少位

3. unpack 解析

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

例子1

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

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

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

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

總結 

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

相關文章

  • Python通過遞歸函數輸出嵌套列表元素

    Python通過遞歸函數輸出嵌套列表元素

    這篇文章主要介紹了Python通過遞歸函數輸出嵌套列表元素,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • python 使用OpenCV進行簡單的人像分割與合成

    python 使用OpenCV進行簡單的人像分割與合成

    這篇文章主要介紹了python 使用OpenCV進行簡單的人像分割與合成的方法,幫助大家更好的利用python處理圖像,感興趣的朋友可以了解下
    2021-02-02
  • python實現取余操作的簡單實例

    python實現取余操作的簡單實例

    在本篇文章里小編給各位分享的是一篇關于python實現取余操作的簡單實例內容,需要的朋友們可以參考下。
    2020-08-08
  • python append、extend與insert的區(qū)別

    python append、extend與insert的區(qū)別

    這篇文章主要介紹了python append、extend與insert的區(qū)別的相關資料,初學者對這幾個概念經常搞混,這里就幫大家理清楚,需要的朋友可以參考下
    2016-10-10
  • Python使用Flask創(chuàng)建 REST API的實現步驟

    Python使用Flask創(chuàng)建 REST API的實現步驟

    本文主要介紹了Python使用Flask創(chuàng)建 REST API的實現步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-02-02
  • python與idea的集成的實現

    python與idea的集成的實現

    這篇文章主要介紹了 python與idea的集成的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Python中的Function定義方法

    Python中的Function定義方法

    Python中,函數是可被重用的程序段。對于函數的定義,可以使用def關鍵字。
    2009-09-09
  • python繪制雪景圖

    python繪制雪景圖

    這篇文章主要為大家詳細介紹了python繪制雪景圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • python集合用法實例分析

    python集合用法實例分析

    這篇文章主要介紹了python集合用法,較為詳細的分析了Python中集合的常見用法,需要的朋友可以參考下
    2015-05-05
  • Python模擬鋼琴鍵盤實現演奏數鴨子歌曲

    Python模擬鋼琴鍵盤實現演奏數鴨子歌曲

    前幾天上課老師給我們講了兩個模塊,然后利用這兩個模塊來模擬鋼琴鍵盤去簡單地演奏《數鴨子》今天來分享給大家,感興趣的可以了解一下
    2022-11-11

最新評論

错那县| 巧家县| 玉树县| 安溪县| 龙岩市| 南京市| 多伦县| 门源| 科尔| 郴州市| 永泰县| 英超| 黎平县| 五莲县| 克拉玛依市| 绥中县| 新和县| 耒阳市| 平山县| 平塘县| 富阳市| 花莲市| 阳信县| 汽车| 兰考县| 久治县| 霍山县| 彭山县| 延庆县| 芦溪县| 玛纳斯县| 抚州市| 渭源县| 正镶白旗| 息烽县| 镇宁| 仙居县| 梅州市| 通海县| 巨鹿县| 克什克腾旗|