屬性
format
格式化字符串。
size
結(jié)構(gòu)體的大小枢冤。
實(shí)例:
1.通常的打包和解包
打包和解包
import struct
import binascii
values = (1, b'good', 1.22) #查看格式化對(duì)照表可知猾封,字符串必須為字節(jié)流類(lèi)型菩颖。
s = struct.Struct('I4sf')
packed_data = s.pack(*values)
unpacked_data = s.unpack(packed_data)
print('Original values:', values)
print('Format string :', s.format)
print('Uses :', s.size, 'bytes')
print('Packed Value :', binascii.hexlify(packed_data))
print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)
結(jié)果:
Original values: (1, b'good', 1.22)
Format string : b'I4sf'
Uses : 12 bytes
Packed Value : b'01000000676f6f64f6289c3f'
Unpacked Type : <class 'tuple'> Value: (1, b'good', 1.2200000286102295)
[Finished in 0.1s]
說(shuō)明:
首先將數(shù)據(jù)對(duì)象放在了一個(gè)元組中,然后創(chuàng)建一個(gè)Struct對(duì)象撞秋,并使用pack()方法打包該元組长捧;最后解包返回該元組。
這里使用到了binascii.hexlify(data)函數(shù)吻贿。
binascii.hexlify(data)
2.使用buffer來(lái)進(jìn)行打包和解包
使用通常的方式來(lái)打包和解包會(huì)造成內(nèi)存的浪費(fèi)串结,所以python提供了buffer的方式:
"""
通過(guò)buffer方式打包和解包
"""
import struct
import binascii
import ctypes
values = (1, b'good', 1.22) #查看格式化字符串可知,字符串必須為字節(jié)流類(lèi)型舅列。
s = struct.Struct('I4sf')
buff = ctypes.create_string_buffer(s.size)
packed_data = s.pack_into(buff,0,*values)
unpacked_data = s.unpack_from(buff,0)
print('Original values:', values)
print('Format string :', s.format)
print('buff :', buff)
print('Packed Value :', binascii.hexlify(buff))
print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)
結(jié)果:
Original values1: (1, b'good', 1.22)
Original values2: (b'hello', True)
buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
Unpacked Type : <class 'tuple'> Value: (1, b'good', 1.2200000286102295)
Unpacked Type : <class 'tuple'> Value: (b'hello', True)
[Finished in 0.1s]
說(shuō)明:
針對(duì)buff對(duì)象進(jìn)行打包和解包肌割,避免了內(nèi)存的浪費(fèi)。
這里使用到了函數(shù)
ctypes.create_string_buffer(init_or_size,size = None)
創(chuàng)建可變字符緩沖區(qū)帐要。
返回的對(duì)象是c_char的ctypes數(shù)組把敞。
init_or_size必須是一個(gè)整數(shù),它指定數(shù)組的大小,或者用于初始化數(shù)組項(xiàng)的字節(jié)對(duì)象。
3.使用buffer方式來(lái)打包多個(gè)對(duì)象
import struct
import binascii
import ctypes
values1 = (1, b'good', 1.22) #查看格式化字符串可知宠叼,字符串必須為字節(jié)流類(lèi)型先巴。
values2 = (b'hello',True)
s1 = struct.Struct('I4sf')
s2 = struct.Struct('5s?')
buff = ctypes.create_string_buffer(s1.size+s2.size)
packed_data_s1 = s1.pack_into(buff,0,*values1)
packed_data_s2 = s2.pack_into(buff,s1.size,*values2)
unpacked_data_s1 = s1.unpack_from(buff,0)
unpacked_data_s2 = s2.unpack_from(buff,s1.size)
print('Original values1:', values1)
print('Original values2:', values2)
print('buff :', buff)
print('Packed Value :', binascii.hexlify(buff))
print('Unpacked Type :', type(unpacked_data_s1), ' Value:', unpacked_data_s1)
print('Unpacked Type :', type(unpacked_data_s2), ' Value:', unpacked_data_s2)
結(jié)果:
Original values2: (b'hello', True)
buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
Unpacked Type : <class 'tuple'> Value: (1, b'good', 1.2200000286102295)
Unpacked Type : <class 'tuple'> Value: (b'hello', True)
[Finished in 0.1s]