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

Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用

 更新時(shí)間:2021年06月16日 16:03:35   作者:一天一篇Python庫  
在C/C++語言中,struct被稱為結(jié)構(gòu)體。而在Python中,struct是一個(gè)專門的庫,用于處理字節(jié)串與原生Python數(shù)據(jù)結(jié)構(gòu)類型之間的轉(zhuǎn)換。本文就詳細(xì)介紹struct的使用方式

二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct

在C/C++語言中,struct被稱為結(jié)構(gòu)體。而在Python中,struct是一個(gè)專門的庫,用于處理字節(jié)串與原生Python數(shù)據(jù)結(jié)構(gòu)類型之間的轉(zhuǎn)換。

本篇,將詳細(xì)介紹二進(jìn)制數(shù)據(jù)結(jié)構(gòu)struct的使用方式。

函數(shù)與Struct類

struct庫包含了一組處理結(jié)構(gòu)值得模塊級函數(shù),以及一個(gè)Struct類。格式指示符將由字符串格式轉(zhuǎn)換為一種編譯表示,這與處理正則表達(dá)式得方式類似。

這個(gè)轉(zhuǎn)換會耗費(fèi)一些資源,所以創(chuàng)建一個(gè)Struct實(shí)例并再這個(gè)實(shí)例上調(diào)用方法時(shí),只完成一次轉(zhuǎn)換,往往會更高效。

打包

Struct支持使用格式指示符將數(shù)據(jù)打包為字符串,另外支持從字符串解包數(shù)據(jù),格式指示符由表示數(shù)據(jù)類型的字符串和可選的數(shù)量及字節(jié)序指示符構(gòu)成。

下面,我們來打包一個(gè)元組,將其轉(zhuǎn)換為16進(jìn)制字節(jié)序列,示例如下:

import struct
import binascii

values = (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))

運(yùn)行之后,效果如下:

打包

這里的格式指示符為“I 3s f”。前面介紹array數(shù)組時(shí),我們已經(jīng)列出過一個(gè)表格。其中I標(biāo)識一個(gè)整型或長整型,3s表示3個(gè)字節(jié)字符串(lyj),f表示浮點(diǎn)數(shù)。

解包

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

import struct
import binascii

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

運(yùn)行之后,效果如下:

解包

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

字節(jié)序指示符

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

代碼 含義
@ 原生順序
= 原生標(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é)序來編碼,如上面代碼所示,只需要改變格式串中提供一個(gè)顯式的字節(jié)序指令,就可以很容易地覆蓋這個(gè)默認(rèn)選擇。

緩沖區(qū)

通常在強(qiáng)調(diào)性能的情況下或者向擴(kuò)展模塊傳入或傳出數(shù)據(jù)時(shí)才會處理二進(jìn)制打包數(shù)據(jù)。

為了避免為每個(gè)打包結(jié)構(gòu)分配一個(gè)新緩沖區(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)行之后,效果如下:

緩沖區(qū)

這里通過兩種方式,創(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 讀取yaml文件的兩種方法(在unittest中使用)

    python 讀取yaml文件的兩種方法(在unittest中使用)

    這篇文章主要介紹了python 讀取yaml文件的兩種方法(在unittest中使用),幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • python pandas cumsum求累計(jì)次數(shù)的用法

    python pandas cumsum求累計(jì)次數(shù)的用法

    這篇文章主要介紹了python pandas cumsum求累計(jì)次數(shù)的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python3爬蟲中識別圖形驗(yàn)證碼的實(shí)例講解

    Python3爬蟲中識別圖形驗(yàn)證碼的實(shí)例講解

    在本篇內(nèi)容里小編給大家分享的是關(guān)于Python3爬蟲中識別圖形驗(yàn)證碼的實(shí)例講解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-07-07
  • Python簡單讀取json文件功能示例

    Python簡單讀取json文件功能示例

    這篇文章主要介紹了Python簡單讀取json文件功能,結(jié)合實(shí)例形式分析了Python文件讀取及json格式數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • python之dlib包安裝失敗問題及解決

    python之dlib包安裝失敗問題及解決

    這篇文章主要介紹了python之dlib包安裝失敗問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 深入理解Tensorflow中的masking和padding

    深入理解Tensorflow中的masking和padding

    TensorFlow 是一個(gè)用于人工智能的開源神器,這篇文章主要介紹了Tensorflow中的masking和padding的相關(guān)知識,通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python后臺管理員管理前臺會員信息的講解

    Python后臺管理員管理前臺會員信息的講解

    今天小編就為大家分享一篇關(guān)于Python后臺管理員管理前臺會員信息的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • python如何利用paramiko執(zhí)行服務(wù)器命令

    python如何利用paramiko執(zhí)行服務(wù)器命令

    這篇文章主要介紹了python如何利用paramiko執(zhí)行服務(wù)器命令,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • 如何在Python 游戲中模擬引力

    如何在Python 游戲中模擬引力

    這篇文章主要介紹了在你的 Python 游戲中模擬引力的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Numpy中的shape、reshape函數(shù)的區(qū)別

    Numpy中的shape、reshape函數(shù)的區(qū)別

    本文主要介紹了Numpy中的shape、reshape函數(shù)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論