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

Python模塊學(xué)習(xí)之struct模塊詳解

 更新時(shí)間:2023年07月26日 11:15:13   作者:Python?學(xué)習(xí)者  
這篇文章主要介紹了Python模塊學(xué)習(xí)之struct模塊詳解,該模塊作用是完成Python數(shù)值和C語(yǔ)言結(jié)構(gòu)體的Python字符串形式間的轉(zhuǎn)換,這可以用于處理存儲(chǔ)在文件中或從網(wǎng)絡(luò)連接中存儲(chǔ)的二進(jìn)制數(shù)據(jù),以及其他數(shù)據(jù)源,需要的朋友可以參考下

struct模塊提供了用于在字節(jié)字符串和Pytdon原生數(shù)據(jù)類(lèi)型之間轉(zhuǎn)換函數(shù),比如數(shù)字和字符串。

該模塊作用是完成Pytdon數(shù)值和C語(yǔ)言結(jié)構(gòu)體的Pytdon字符串形式間的轉(zhuǎn)換。 這可以用于處理存儲(chǔ)在文件中或從網(wǎng)絡(luò)連接中存儲(chǔ)的二進(jìn)制數(shù)據(jù),以及其他數(shù)據(jù)源。

1. 模塊函數(shù)和Struct類(lèi)

它除了提供一個(gè)Struct類(lèi)之外,還有許多模塊級(jí)的函數(shù)用于處理結(jié)構(gòu)化的值。這里有個(gè)格式符(Format specifiers)的概念,是指從字符串格式轉(zhuǎn)換為已編譯的表示形式,類(lèi)似于正則表達(dá)式的處理方式。通常實(shí)例化Struct類(lèi),調(diào)用類(lèi)方法來(lái)完成轉(zhuǎn)換,比直接調(diào)用模塊函數(shù)有效的多。

下面的例子都是使用Struct類(lèi)。

2. Packing(打包)和Unpacking(解包)

Struct支持將數(shù)據(jù)packing(打包)成字符串,并能從字符串中逆向unpacking(解壓)出數(shù)據(jù)。

在本例中,格式指定器(specifier)需要一個(gè)整型或長(zhǎng)整型,一個(gè)兩個(gè)字節(jié)的string,和一個(gè)浮點(diǎn)數(shù)。格式符中的空格用于分隔各個(gè)指示器(indicators),在編譯格式時(shí)會(huì)被忽略。

import struct
import binascii
values = (1, 'ab'.encode('utf-8'), 2.7)
s = struct.Struct('I 2s f')
packed_data = s.pack(*values)
print('原始值:', values)
print('格式符:', s.format)
print('占用字節(jié):', s.size)
print('打包結(jié)果:', binascii.hexlify(packed_data))

輸出:

原始值: (1, b'ab', 2.7)
格式符: b'I 2s f'
占用字節(jié): 12
打包結(jié)果: b'0100000061620000cdcc2c40'

這個(gè)示例將打包的值轉(zhuǎn)換為十六進(jìn)制字節(jié)序列,用binascii.hexlify()方法打印出來(lái)。

使用unpack()方法解包。

import struct
import binascii
packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')
s = struct.Struct('I 2s f')
unpacked_data = s.unpack(packed_data)
print('解包結(jié)果:', unpacked_data)

輸出:

解包結(jié)果: (1, b'ab', 2.700000047683716)

將打包的值傳給unpack(),基本上返回相同的值(浮點(diǎn)數(shù)會(huì)有差異)。

3. 字節(jié)順序/大小/對(duì)齊

默認(rèn)情況下,pack是使用本地C庫(kù)的字節(jié)順序來(lái)編碼的。格式化字符串的第一個(gè)字符可以用來(lái)表示填充數(shù)據(jù)的字節(jié)順序、大小和對(duì)齊方式,如下表所描述的:

CharacterByte orderSizeAlignment
@本地本地本地
=本地standardnone
<little-endian(小字節(jié)序)standardnone
>big-endian(大字節(jié)序)standardnone
!network (= big-endian)standardnone

如果格式符中沒(méi)有設(shè)置這些,那么默認(rèn)將使用 @。

本地字節(jié)順序是指字節(jié)順序是由當(dāng)前主機(jī)系統(tǒng)決定。比如:Intel x86和AMD64(x86-64)使用小字節(jié)序; Motorola 68000和 PowerPC G5使用大字節(jié)序。ARM和Intel安騰支持切換字節(jié)序??梢允褂胹ys.byteorder查看當(dāng)前系統(tǒng)的字節(jié)順序。

本地大小(Size)和對(duì)齊(Alignment)是由c編譯器的sizeof表達(dá)式確定的。它與本地字節(jié)順序?qū)?yīng)。

標(biāo)準(zhǔn)大小由格式符確定,下面會(huì)講各個(gè)格式的標(biāo)準(zhǔn)大小。

示例:

4. 格式符

格式符對(duì)照表如下:

在這里插入圖片描述

5. 緩沖區(qū)

將數(shù)據(jù)打包成二進(jìn)制通常是用在對(duì)性能要求很高的場(chǎng)景。

在這類(lèi)場(chǎng)景中可以通過(guò)避免為每個(gè)打包結(jié)構(gòu)分配新緩沖區(qū)的開(kāi)銷(xiāo)來(lái)優(yōu)化。

pack_into()和unpack_from()方法支持直接寫(xiě)入預(yù)先分配的緩沖區(qū)。

import array
import binascii
import ctypes
import struct
s = struct.Struct('I 2s f')
values = (1, 'ab'.encode('utf-8'), 2.7)
print('原始值:', values)
print()
print('使用ctypes模塊string buffer')
b = ctypes.create_string_buffer(s.size)
print('原始buffer  :', binascii.hexlify(b.raw))
s.pack_into(b, 0, *values)
print('打包結(jié)果寫(xiě)入 :', binascii.hexlify(b.raw))
print('解包        :', s.unpack_from(b, 0))
print()
print('使用array模塊')
a = array.array('b', b'\0' * s.size)
print('原始值   :', binascii.hexlify(a))
s.pack_into(a, 0, *values)
print('打包寫(xiě)入 :', binascii.hexlify(a))
print('解包     :', s.unpack_from(a, 0))

輸出:

原始值: (1, b'ab', 2.7)
使用ctypes模塊string buffer
原始buffer  : b'000000000000000000000000'
打包結(jié)果寫(xiě)入 : b'0100000061620000cdcc2c40'
解包        : (1, b'ab', 2.700000047683716)
使用array模塊
原始值   : b'000000000000000000000000'
打包寫(xiě)入 : b'0100000061620000cdcc2c40'
解包     : (1, b'ab', 2.700000047683716)

到此這篇關(guān)于Python模塊學(xué)習(xí)之struct模塊詳解的文章就介紹到這了,更多相關(guān)Python的struct模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)

    大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)

    這篇文章主要為大家介紹了大語(yǔ)言模型的開(kāi)發(fā)利器langchain安裝使用快速入門(mén)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Python計(jì)算字符寬度的方法

    Python計(jì)算字符寬度的方法

    這篇文章主要介紹了Python計(jì)算字符寬度的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python針對(duì)字符寬度的計(jì)算方法,需要的朋友可以參考下
    2016-06-06
  • Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)并且解析的實(shí)例

    Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)并且解析的實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)并且解析的功能實(shí)例,主要以解析百度問(wèn)答為例說(shuō)明其原理與方法,需要的朋友可以參考下
    2014-09-09
  • 利用Python實(shí)現(xiàn)斐波那契數(shù)列的方法實(shí)例

    利用Python實(shí)現(xiàn)斐波那契數(shù)列的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于如何利用Python實(shí)現(xiàn)斐波那契數(shù)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 淺析Python打包時(shí)包含靜態(tài)文件處理方法

    淺析Python打包時(shí)包含靜態(tài)文件處理方法

    這篇文章主要介紹了Python打包時(shí)包含靜態(tài)文件處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • python點(diǎn)擊鼠標(biāo)獲取坐標(biāo)(Graphics)

    python點(diǎn)擊鼠標(biāo)獲取坐標(biāo)(Graphics)

    這篇文章主要為大家詳細(xì)介紹了python點(diǎn)擊鼠標(biāo)獲取坐標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 使用Python腳本來(lái)控制Windows Azure的簡(jiǎn)單教程

    使用Python腳本來(lái)控制Windows Azure的簡(jiǎn)單教程

    這篇文章主要介紹了使用Python腳本來(lái)控制Windows Azure的簡(jiǎn)單教程,由于微軟官方提供了Python SDK,使得用戶(hù)自己用Python控制Azure成為了可能,需要的朋友可以參考下
    2015-04-04
  • Python批量處理工作簿和工作表的實(shí)現(xiàn)示例

    Python批量處理工作簿和工作表的實(shí)現(xiàn)示例

    本文主要介紹了使用Python批量處理工作簿和工作表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • pandas的qcut()方法詳解

    pandas的qcut()方法詳解

    這篇文章主要介紹了pandas的qcut()方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Python中的動(dòng)態(tài)屬性和特性

    詳解Python中的動(dòng)態(tài)屬性和特性

    本篇文章主要介紹了詳解Python中的動(dòng)態(tài)屬性和特性,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論