91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

struct模塊怎么在Python項目中使用

發布時間:2021-03-17 16:26:16 來源:億速云 閱讀:156 作者:Leah 欄目:開發技術

這篇文章給大家介紹struct模塊怎么在Python項目中使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

模塊函數和Struct類

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

Packing(打包)和Unpacking(解包)

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

在本例中,格式指定器(specifier)需要一個整型或長整型,一個兩個字節的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('占用字節:', s.size)
print('打包結果:', binascii.hexlify(packed_data))

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

這個示例將打包的值轉換為十六進制字節序列,用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(),基本上返回相同的值(浮點數會有差異)。

字節順序/大小/對齊

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

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

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

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

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

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

示例:

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('占用字節: ', 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
占用字節:  12
打包結果:  b'0100000061620000cdcc2c40'
解包結果:  (1, b'ab', 2.700000047683716)

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

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

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

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

格式符

格式符對照表如下:

FormatC TypePython typeStandard sizeNotes
xpad byteno value

ccharbytes of length 11
bsigned charinteger1(1),(3)
Bunsigned charinteger1(3)
?_Boolbool1(1)
hshortinteger2(3)
Hunsigned shortinteger2(3)
iintinteger4(3)
Iunsigned intinteger4(3)
llonginteger4(3)
Lunsigned longinteger4(3)
qlong longinteger8(2), (3)
Qunsigned long longinteger8(2), (3)
nssize_tinteger(4)
Nsize_tinteger(4)
ffloatfloat4(5)
ddoublefloat8(5)
schar[]bytes

pchar[]bytes

Pvoid *integer
(6)

緩沖區

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

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

pack_into()和unpack_from()方法支持直接寫入預先分配的緩沖區。

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)

關于struct模塊怎么在Python項目中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

交城县| 迁西县| 会泽县| 宁陵县| 宣武区| 望都县| 德保县| 凌云县| 文成县| 文登市| 苏尼特右旗| 岫岩| 渭源县| 九龙县| 汝南县| 定远县| 阜康市| 浠水县| 北票市| 驻马店市| 兰西县| 松潘县| 时尚| 乐昌市| 元谋县| 大同市| 濮阳县| 隆昌县| 安国市| 乌兰浩特市| 宣恩县| 靖西县| 兴宁市| 修文县| 邓州市| 渑池县| 昆山市| 阳城县| 永德县| 夹江县| 桐庐县|