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模块

评论关闭