python学习之struct模块,,class stru
python学习之struct模块,,class stru
class struct.Struct(format)
返回一个struct对象(结构体,参考C)。
该对象可以根据格式化字符串的格式来读写二进制数据。
第一个参数格式化字符串可以指定字节的顺序。
默认是根据系统来确定,也提供自定义的方式,只需要在前面加上特定字符即可:
struct.Struct(‘>I4sf‘)
特定字符对照表附件有。
常见方法和属性:
struct.pack(fmt, v1, v2, …)
返回一个字节流对象。
按照fmt(格式化字符串)的格式来打包参数v1,v2,...。
通俗的说就是:
首先将不同类型的数据对象放在一个“组”中(比如元组(1,‘good‘,1.22)),
然后打包(“组”转换为字节流对象),最后再解包(将字节流对象转换为“组”)。
format
格式化字符串。
size
结构体的大小。
实例:
1.通常的打包和解包
# -*- coding: utf-8 -*-"""打包和解包"""import structimport binasciivalues = (1, b‘good‘, 1.22) #查看格式化字符串可知,字符串必须为字节流类型。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)
结果:
Original values: (1, b‘good‘, 1.22)Format string : b‘I4sf‘Uses : 12 bytesPacked Value : b‘01000000676f6f64f6289c3f‘Unpacked Type : <class ‘tuple‘> Value: (1, b‘good‘, 1.2200000286102295)[Finished in 0.1s]
说明:
首先将数据对象放在了一个元组中,然后创建一个Struct对象,并使用pack()方法打包该元组;最后解包返回该元组。
这里使用到了binascii.hexlify(data)函数。
binascii.hexlify(data)
返回二进制数据的十六进制表示。
2.使用buffer来进行打包和解包
# -*- coding: utf-8 -*-"""通过buffer方式打包和解包"""import structimport binasciiimport ctypesvalues = (1, b‘good‘, 1.22) #查看格式化字符串可知,字符串必须为字节流类型。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)
结果:
Original values: (1, b‘good‘, 1.22)Format string : b‘I4sf‘buff : <ctypes.c_char_Array_12 object at 0x00000008A8C27348>Packed Value : b‘01000000676f6f64f6289c3f‘Unpacked Type : <class ‘tuple‘> Value: (1, b‘good‘, 1.2200000286102295)[Finished in 0.1s]
说明:
附:
1.格式化对照表
2.字节顺序,大小和校准
python学习之struct模块
评论关闭