亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python標準庫筆記struct模塊的使用

 更新時間:2018年02月22日 14:00:31   作者:j_hao104  
這篇文章主要介紹了Python標準庫筆記struct模塊的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近在學習python網絡編程這一塊,在寫簡單的socket通信代碼時,遇到了struct這個模塊的使用,當時不太清楚這到底有和作用,后來查閱了相關資料大概了解了,在這里做一下簡單的總結。

了解c語言的人,一定會知道struct結構體在c語言中的作用,它定義了一種結構,里面包含不同類型的數據(int,char,bool等等),方便對某一結構對象進行處理。而在網絡通信當中,大多傳遞的數據是以二進制流(binary data)存在的。當傳遞字符串時,不必擔心太多的問題,而當傳遞諸如int、char之類的基本數據的時候,就需要有一種機制將某些特定的結構體類型打包成二進制流的字符串然后再網絡傳輸,而接收端也應該可以通過某種機制進行解包還原出原始的結構體數據。python中的struct模塊就提供了這樣的機制,該模塊的主要作用就是對python基本類型值與用python字符串格式表示的C struct類型間的轉化(This module performs conversions between Python values and C structs represented as Python strings.)。stuct模塊提供了很簡單的幾個函數,下面寫幾個例子。

該模塊作用是完成Python數值和C語言結構體的Python字符串形式間的轉換。這可以用于處理存儲在文件中或從網絡連接中存儲的二進制數據,以及其他數據源。

用途: 在Python基本數據類型和二進制數據之間進行轉換

struct模塊提供了用于在字節(jié)字符串和Python原生數據類型之間轉換函數,比如數字和字符串。

模塊函數和Struct類

它除了提供一個Struct類之外,還有許多模塊級的函數用于處理結構化的值。這里有個格式符(Format specifiers)的概念,是指從字符串格式轉換為已編譯的表示形式,類似于正則表達式的處理方式。通常實例化Struct類,調用類方法來完成轉換,比直接調用模塊函數有效的多。下面的例子都是使用Struct類。

Packing(打包)和Unpacking(解包)

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

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

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('打包結果:', binascii.hexlify(packed_data))

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

這個示例將打包的值轉換為十六進制字節(jié)序列,用binascii.hexlify()方法打印出來。

使用unpack()方法解包。

import struct
import binascii

packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')

s = struct.Struct('I 2s f')
unpacked_data = s.unpack(packed_data)
print('解包結果:', unpacked_data)

# output
解包結果: (1, b'ab', 2.700000047683716)

將打包的值傳給unpack(),基本上返回相同的值(浮點數會有差異)。

字節(jié)順序/大小/對齊

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

Character Byte order Size Alignment
@ 本地 本地 本地
= 本地 standard none
< little-endian(小字節(jié)序) standard none
> big-endian(大字節(jié)序) standard none
! network (= big-endian) standard none

如果格式符中沒有設置這些,那么默認將使用 @。

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

本地大小(Size)和對齊(Alignment)是由c編譯器的sizeof表達式確定的。它與本地字節(jié)順序對應。

標準大小由格式符確定,下面會講各個格式的標準大小。

示例:

import struct
import binascii

values = (1, 'ab'.encode('utf-8'), 2.7)
print('原始值 : ', values)

endianness = [
 ('@', 'native, native'),
 ('=', 'native, standard'),
 ('<', 'little-endian'),
 ('>', 'big-endian'),
 ('!', 'network'),
]

for code, name in endianness:
 s = struct.Struct(code + ' I 2s f')
 packed_data = s.pack(*values)
 print()
 print('格式符 : ', s.format, 'for', name)
 print('占用字節(jié): ', s.size)
 print('打包結果: ', binascii.hexlify(packed_data))
 print('解包結果: ', s.unpack(packed_data))

# output
原始值  :  (1, b'ab', 2.7)

格式符  :  b'@ I 2s f' for native, native
占用字節(jié):  12
打包結果:  b'0100000061620000cdcc2c40'
解包結果:  (1, b'ab', 2.700000047683716)

格式符  :  b'= I 2s f' for native, standard
占用字節(jié):  10
打包結果:  b'010000006162cdcc2c40'
解包結果:  (1, b'ab', 2.700000047683716)

格式符  :  b'< I 2s f' for little-endian
占用字節(jié):  10
打包結果:  b'010000006162cdcc2c40'
解包結果:  (1, b'ab', 2.700000047683716)

格式符  :  b'> I 2s f' for big-endian
占用字節(jié):  10
打包結果:  b'000000016162402ccccd'
解包結果:  (1, b'ab', 2.700000047683716)

格式符  :  b'! I 2s f' for network
占用字節(jié):  10
打包結果:  b'000000016162402ccccd'
解包結果:  (1, b'ab', 2.700000047683716)

格式符

格式符對照表如下:

Format C Type Python type Standard size Notes
x pad byte no value
c char bytes of length 1 1
b signed char integer 1 (1),(3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
n ssize_t integer (4)
N size_t integer (4)
f float float 4 (5)
d double float 8 (5)
s char[] bytes
p char[] bytes
P void * integer (6)

緩沖區(qū)

將數據打包成二進制通常是用在對性能要求很高的場景。

在這類場景中可以通過避免為每個打包結構分配新緩沖區(qū)的開銷來優(yōu)化。

pack_into()和unpack_from()方法支持直接寫入預先分配的緩沖區(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('打包結果寫入 :', 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('打包寫入 :', binascii.hexlify(a))
print('解包  :', s.unpack_from(a, 0))

# output
原始值: (1, b'ab', 2.7)

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

使用array模塊
原始值   : b'000000000000000000000000'
打包寫入 : b'0100000061620000cdcc2c40'
解包     : (1, b'ab', 2.700000047683716)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解讀時間序列分析之ADF檢驗

    解讀時間序列分析之ADF檢驗

    這篇文章主要介紹了解讀時間序列分析之ADF檢驗,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python openCV實現攝像頭獲取人臉圖片

    python openCV實現攝像頭獲取人臉圖片

    這篇文章主要為大家詳細介紹了python openCV實現攝像頭獲取人臉圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Python運維之獲取系統CPU信息的實現方法

    Python運維之獲取系統CPU信息的實現方法

    今天小編就為大家分享一篇Python運維之獲取系統CPU信息的實現方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python requests模塊cookie實例解析

    Python requests模塊cookie實例解析

    這篇文章主要介紹了Python requests模塊cookie實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 基于Python+Matplotlib實現直方圖的繪制

    基于Python+Matplotlib實現直方圖的繪制

    Matplotlib是Python的繪圖庫,它能讓使用者很輕松地將數據圖形化,并且提供多樣化的輸出格式。本文將為大家介紹如何用matplotlib繪制直方圖,感興趣的朋友可以學習一下
    2022-04-04
  • Python中實現地圖可視化的方法小結

    Python中實現地圖可視化的方法小結

    Python提供了多個強大的庫,如Folium、Matplotlib、Geopandas等,使得創(chuàng)建漂亮而具有信息量的地圖變得簡單而靈活,本文將詳細介紹如何使用這些庫繪制漂亮的地圖,感興趣的可以了解下
    2023-12-12
  • 在pytorch 中計算精度、回歸率、F1 score等指標的實例

    在pytorch 中計算精度、回歸率、F1 score等指標的實例

    今天小編就為大家分享一篇在pytorch 中計算精度、回歸率、F1 score等指標的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python中必要的名詞解釋

    python中必要的名詞解釋

    在本篇文章里小編給大家整理的是關于python中必要的名詞解釋以及相關知識點,有興趣的朋友們學習下。
    2019-11-11
  • python教程十行代碼教你語音轉文字QQ微信聊天

    python教程十行代碼教你語音轉文字QQ微信聊天

    QQ上面發(fā)的語音消息是可以直接文字識別的,但是微信為什么沒有呢?是因為技術太難實現嗎?這個很簡單啊!今天給大家介紹一下語音轉文字的原理
    2021-09-09
  • python time模塊用法實例詳解

    python time模塊用法實例詳解

    這篇文章主要介紹了python中time模塊的用法,包括了各類時間函數,需要的朋友可以參考下
    2014-09-09

最新評論