代碼 | 含義 |
---|---|
@ | 原生順序 |
= | 原生標(biāo)準(zhǔn) |
小端 | |
> | 大端 |
! | 網(wǎng)絡(luò)順序 |
示例如下:
import struct import binascii values = (2, 'lyj'.encode('UTF-8'), 3.8) endianness = [ ('@', '原生順序'), ('=', '原生標(biāo)準(zhǔn)'), ('', '小端'), ('>', '大端'), ('!', '網(wǎng)絡(luò)順序'), ] 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))
運(yùn)行之后,效果如下:
如果想改變字節(jié)序來編碼,如上面代碼所示,只需要改變格式串中提供一個顯式的字節(jié)序指令,就可以很容易地覆蓋這個默認(rèn)選擇。
通常在強(qiáng)調(diào)性能的情況下或者向擴(kuò)展模塊傳入或傳出數(shù)據(jù)時才會處理二進(jìn)制打包數(shù)據(jù)。
為了避免為每個打包結(jié)構(gòu)分配一個新緩沖區(qū)所帶來的開銷,通常情況下,我們使用pack_into()和unpack_from()方法支持直接寫入預(yù)分配的緩沖區(qū)。
示例如下:
import struct import binascii import ctypes import array values = (2, 'lyj'.encode('UTF-8'), 3.8) s = struct.Struct('I 3s f') print("原始值:", values) b = ctypes.create_string_buffer(s.size) print("打包之前(緩沖區(qū)的值):", binascii.hexlify(b.raw)) s.pack_into(b, 0, *values) print("打包之后(緩沖區(qū)的值):", binascii.hexlify(b.raw)) print("解包:", s.unpack_from(b, 0)) a = array.array('b', b'\0' * s.size) print("打包之前(緩沖區(qū)的值):", binascii.hexlify(a)) s.pack_into(a, 0, *values) print('打包之后(緩沖區(qū)的值):', binascii.hexlify(a)) print("解包:", s.unpack_from(a, 0))
運(yùn)行之后,效果如下:
這里通過兩種方式,創(chuàng)建緩沖區(qū)。其中size屬性用于指出緩沖區(qū)需要的大小。
到此這篇關(guān)于Pytho 二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用的文章就介紹到這了,更多相關(guān)Pytho 二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:安慶 岳陽 清遠(yuǎn) 洛陽 怒江 長春 吉林 泉州
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用》,本文關(guān)鍵詞 Python,二進(jìn)制,數(shù)據(jù)結(jié)構(gòu),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。