python進行二進位數據處理的方法

来源:https://www.cnblogs.com/Pythonmiss/archive/2023/12/19/17914486.html
-Advertisement-
Play Games

1. 賦值語句的特點 賦值語句創建對象的引用:賦值語句總是創建對象的引用,而不是複製對象。因此,Python中的變數更像是指針,而不是數據儲存區域。 變數在首次賦值時會被創建:因此不需要提前聲明變數。 變數在引用前必須先賦值:如果引用未賦值的變數會報錯 2. 賦值語句的形式 (1. 普通形式 >>> ...


方法一:

使用struct模塊,特點輕量化,簡單易用。缺點就是可讀性不是太好,使用小數據臨時使用一下,對於大量的數據解析,寫起來比較繁瑣,顯得有點力不從心。

import struct

data = b'\x92\xaa\xbb\xcc\x11\x22\x33\x44'
a,b,c,d,e = struct.unpack(">BBBBI", data)
print("a=0x%x b=0x%x c=0x%x d=0x%x e=0x%x"%(a,b,c,d,e))
packData = struct.pack(">BBBBI", a, b, c, d, e)
print("packData: %s"%packData)

上面的程式會按照給定的格式一次解析數據,得到的輸出結果如下:

註:建議採用python3運行,python2不區分bytes和string類型,通過struct.pack()得到的結果為字元串類型,會列印出亂碼。

a=0x92 b=0xaa c=0xbb d=0xcc e=0x11223344
packData: b'\x92\xaa\xbb\xcc\x11"3D'

可以看出,能夠正確的解析和組裝出需要的的數據。

struct常用函數原型如下:

struct的方法 說明
pack(fmt, v1, v2…) 按照fmt指定的格式化要求,格式化v1,v2等後續參數,返回bytes類型
unpack(fmt, BytesData) 按照fmt指定的格式要求,解析出bytesData裡面的數據內容,返回的是數據元組
pack_from(fmt, BytesData, offset) 按照fmt指定的格式要求,解析後面的內容,從offset處開始解析,返回的是數據元組

這個裡面的fmt表示格式化字元串,由兩個部分組成,第一部分為指定大小端格式,第二部分是依次解析的格式。

大小端格式字元 說明 .
> 大端模式 和閱讀順序一致,高位元組在前(記憶體地址小),低位元組在後(地址大)。
< 小端模式 和大端相反,高位元組在後(記憶體地址大),低位元組在前面(地址小)。
@或者= 主機預設位元組序 和主機系統強相關,X86/X64預設為小段模式。其中@還會強制4位元組對齊。

解析格式如下:

格式字元 ctypes類型 位元組數
c c_char 1
b c_byte 1
B c_ubyte 1
h c_short 2
H c_ushort 2
i c_int 4
I c_uint 4
q c_longlong 8
Q c_ulonglong 8
f c_float 4
d c_double 8
p c_char_p 4(64位系統為8)
P c_void_p 4(64位系統為8)
x c_ubyte(占位padding位元組) 1

方法二:

使用ctypes模塊高效的解析組裝二進位數據,這種方法和C比較類似,也更為強大。

import ctypes

class TestBig_Struct(ctypes.BigEndianStructure):
    _fields_=[
        ('b1', ctypes.c_ubyte,1),
        ('b2', ctypes.c_ubyte,1),
        ('b3', ctypes.c_ubyte,1),
        ('b4', ctypes.c_ubyte,1),
        ('lev',ctypes.c_ubyte,4),
        ('BB', ctypes.c_ubyte),
        ('BC', ctypes.c_ubyte),
        ('BD', ctypes.c_ubyte),
        ('SS', ctypes.c_ushort),
    ]
    

class Test_Struct(ctypes.Structure):
    _fields_=[
        ('b1', ctypes.c_ubyte, 1),
        ('b2', ctypes.c_ubyte, 1),
        ('b3', ctypes.c_ubyte, 1),
        ('b4', ctypes.c_ubyte, 1),
        ('lev',ctypes.c_ubyte, 4),
        ('BB', ctypes.c_ubyte),
        ('BC', ctypes.c_ubyte),
        ('BD', ctypes.c_ubyte),
        ('SS', ctypes.c_ushort),
    ]
#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
if __name__ == '__main__':
    test = Test_Struct();
    test.b1 = 1;
    test.b2 = 0;
    test.b3 = 0;
    test.b4 = 1;
    test.lev = 2;
    test.BB = 0xAA;
    test.BC = 0xBB;
    test.BD = 0xCC;
    test.SS = 0xEEFF;
    print ("defEndian", ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)))
    test = TestBig_Struct();
    test.b1 = 1;
    test.b2 = 0;
    test.b3 = 0;
    test.b4 = 1;
    test.lev = 2;
    test.BB = 0xAA;
    test.BC = 0xBB;
    test.BD = 0xCC;
    test.SS = 0xEEFF;
    print ("BigEndian", ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)))
    ctypes.memmove(ctypes.addressof(test), b'\x92\xaa\xbb\xcc\xee\xff', ctypes.sizeof(test));
    print ("b1:%x"%test.b1)
    print ("b2:%x"%test.b2)
    print ("b3:%x"%test.b3)
    print ("b4:%x"%test.b4)
    print ("lev:%x"%test.lev)
    print ("BB:%x"%test.BB)
    print ("BC:%x"%test.BC)
    print ("BD:%x"%test.BD)
    print ("SS:%x"%test.SS)
    with open("out.bin", "wb") as f:
        f.write(ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)));

從上面的實例,可以看出來,這個就是採用類似與C結構體的方式,直接解析映射來解析和組裝數據。十分的強大。這個實常式序的運行結果如下。

defEndian b')\xaa\xbb\xcc\xff\xee'
BigEndian b'\x92\xaa\xbb\xcc\xee\xff'
b1:1
b2:0
b3:0
b4:1
lev:2
BB:aa
BC:bb
BD:cc
SS:eeff

其中out.bin文件中保存的數據,以十六進位查看如下:

92 aa bb cc ee ff

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、qiankun使用場景 1. 簡介:qiankun是在single-spa的基礎上實現的,可以保證各個項目獨立使用,也可以集成使用。各系統之間不受技術棧的限制,集成使用也能保證各樣式和全局變數的隔離。 模塊的插拔式使用,當公司項目集是一個大系統下包含多個子系統或者模塊時,可以採用這種方式動態部署 ...
  • 你知道奇怪的移動視口錯誤(也稱為100vh bug)嗎?或者如何以正確的方式創建全屏塊? 一、100vh bug 什麼是移動視口錯誤? 你是否曾經在網頁上創建過全屏元素?只需添加一行 CSS 並不難: .my-page { height: 100vh } 1vh是視口高度的1% ,正是我們所需要的。 ...
  • 基於 Chromium 的瀏覽器占了全球市場的 7 成!對於前端開發來說,Chrome 更是形影不離的飯碗級軟體
  • 前言 經過上個章節的介紹,大家可以瞭解到 uni-app-數據緩存 的基本使用方法 那本章節來給大家介紹一下 uni-app-pinia存儲數據 的基本使用方法 經過我這麼多篇章的介紹,我發現大家環境比較耗時,所以在今後的文章中,我會儘量減少環境的搭建 如果某一篇的文章環境確實是不一樣的,我會在文章 ...
  • 1. 行為準則 2. 需求的不確定性 2.1. 不斷變化的客戶需求 2.2. 軟體項目無法避免的挑戰 2.3. 產品需求和環境會隨著時間的推移而改變,你的應用程式也必須隨之改變 2.4. 不斷變化的需求會導致不穩定性,使開發工作偏離軌道 2.5. 通過構建可演進的架構來適應不斷變化的需求 2.5.1 ...
  • 3.1、環境搭建 3.1.1、在project創建新module 3.1.2、選擇maven 3.1.3、設置module名稱和路徑 3.1.4、module初始狀態 3.1.5、引入springboot父工程 <parent> <groupId>org.springframework.boot</ ...
  • 1. 線程池相關基本概念 任務(Task):任務是線程池中要執行的工作單元。任務可以是實現了 Runnable 介面或 Callable 介面的對象。Runnable 任務沒有返回值,而 Callable 任務可以返回一個結果。 線程池管理器(ThreadPool Manager):線程池管理器是用 ...
  • GoFrame Helper是一款適用於 Goland/IntelliJ IDEA Ultimate插件,它為 GoFrame 提供 ORM, Config, OpenApi 結構體標簽代碼輔助;Api, Controller, Service 代碼模板;監聽 Api, Logic 自動生成對應的 ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...