亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Python二進制數據結構Struct的具體使用

瀏覽:87日期:2022-06-16 14:37:46
目錄二進制數據結構Struct函數與Struct類打包解包字節序指示符緩沖區二進制數據結構Struct

在C/C++語言中,struct被稱為結構體。而在Python中,struct是一個專門的庫,用于處理字節串與原生Python數據結構類型之間的轉換。

本篇,將詳細介紹二進制數據結構struct的使用方式。

函數與Struct類

struct庫包含了一組處理結構值得模塊級函數,以及一個Struct類。格式指示符將由字符串格式轉換為一種編譯表示,這與處理正則表達式得方式類似。

這個轉換會耗費一些資源,所以創建一個Struct實例并再這個實例上調用方法時,只完成一次轉換,往往會更高效。

打包

Struct支持使用格式指示符將數據打包為字符串,另外支持從字符串解包數據,格式指示符由表示數據類型的字符串和可選的數量及字節序指示符構成。

下面,我們來打包一個元組,將其轉換為16進制字節序列,示例如下:

import structimport binasciivalues = (2, ’lyj’.encode(’UTF-8’), 3.8)s = struct.Struct(’I 3s f’)packed_data = s.pack(*values)print('原值:', values)print('格式指示符:', s.format)print('大小:', s.size, ’bytes’)print('打包值:', binascii.hexlify(packed_data))

運行之后,效果如下:

Python二進制數據結構Struct的具體使用

這里的格式指示符為“I 3s f”。前面介紹array數組時,我們已經列出過一個表格。其中I標識一個整型或長整型,3s表示3個字節字符串(lyj),f表示浮點數。

解包

struct庫使用unpack()可以從打包的表示數據中抽取數據,這里直接復制上面的打包值,進行測試。示例如下:

import structimport binasciipacked_data = binascii.unhexlify(b’020000006c796a0033337340’)s = struct.Struct(’I 3s f’)unpacked_data = s.unpack(packed_data)print('解包值:', unpacked_data)

運行之后,效果如下:

Python二進制數據結構Struct的具體使用

雖然使用unpack()解包基本會得到相同值,但浮點數的值有微小的差別。

字節序指示符

默認情況下,值會使用原生C庫的字節序(endianness)來編碼。Struct的字節序指示符如下表所示:

代碼 含義 @ 原生順序 = 原生標準 < 小端 > 大端 ! 網絡順序

示例如下:

import structimport binasciivalues = (2, ’lyj’.encode(’UTF-8’), 3.8)endianness = [ (’@’, ’原生順序’), (’=’, ’原生標準’), (’<’, ’小端’), (’>’, ’大端’), (’!’, ’網絡順序’),]for code, name in endianness: s = struct.Struct(code + ’ I 3s f’) packed_data = s.pack(*values) print('格式化字符串:', s.format, ’ for ’, name) print('大小:', s.size, ’bytes’) print('打包:', binascii.hexlify(packed_data)) print('解包:', s.unpack(packed_data))

運行之后,效果如下:

Python二進制數據結構Struct的具體使用

如果想改變字節序來編碼,如上面代碼所示,只需要改變格式串中提供一個顯式的字節序指令,就可以很容易地覆蓋這個默認選擇。

緩沖區

通常在強調性能的情況下或者向擴展模塊傳入或傳出數據時才會處理二進制打包數據。

為了避免為每個打包結構分配一個新緩沖區所帶來的開銷,通常情況下,我們使用pack_into()和unpack_from()方法支持直接寫入預分配的緩沖區。

示例如下:

import structimport binasciiimport ctypesimport arrayvalues = (2, ’lyj’.encode(’UTF-8’), 3.8)s = struct.Struct(’I 3s f’)print('原始值:', values)b = ctypes.create_string_buffer(s.size)print('打包之前(緩沖區的值):', binascii.hexlify(b.raw))s.pack_into(b, 0, *values)print('打包之后(緩沖區的值):', binascii.hexlify(b.raw))print('解包:', s.unpack_from(b, 0))a = array.array(’b’, b’0’ * s.size)print('打包之前(緩沖區的值):', binascii.hexlify(a))s.pack_into(a, 0, *values)print(’打包之后(緩沖區的值):’, binascii.hexlify(a))print('解包:', s.unpack_from(a, 0))

運行之后,效果如下:

Python二進制數據結構Struct的具體使用

這里通過兩種方式,創建緩沖區。其中size屬性用于指出緩沖區需要的大小。

到此這篇關于Pytho 二進制數據結構Struct的具體使用的文章就介紹到這了,更多相關Pytho 二進制數據結構Struct內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 日本片网站 | 国产午夜视频 | 产国语一级特黄aa大片 | 欧美亚洲偷图色综合91 | 久久久久国产成人精品 | 国产久热香蕉在线观看 | 嫩草视频在线观看www视频 | 91精品免费观看老司机 | sese视频在线观看 | 尤物视频在线观看网站 | 国产精品视频人人做人人爱 | 午夜性激福利免费观看 | 爱爱免费看 | 日韩中文字幕免费观看 | 欧美一级毛片免费观看视频 | 国产国产人免费人成免费视频 | 亚洲欧美日韩高清在线看 | 永久免费毛片在线播放 | 国产在线观看免费不卡 | 久久精品国产免费看久久精品 | 一级做a爰片久久毛片免费看 | 美国一级毛片∞ | 国产乱理伦片在线观看 | 亚洲123| 成人爽爽激情在线观看 | 在线欧美v日韩v国产精品v | 欧美在线一区二区三区欧美 | 精品视频在线观看一区二区三区 | 东京不太热视频高清在线 | 92国产福利视频一区二区 | 亚洲国产三级 | 国产美女视频国产视视频 | 亚洲欧洲日产国码天堂 | 青青青视频蜜桃一区二区 | 1024国产精品视频观看 | 亚欧在线精品免费观看一区 | 国产美女自拍视频 | 免费看色片网站 | 国产欧洲亚洲 | 亚洲综合一二三区 | 韩国免费播放一级毛片 |