TUhjnbcbe - 2024/9/8 19:21:00
该struct模块包括用于在字节串和本机Python数据类型(如数字和字符串)之间进行转换的函数。函数与结构类一组模块级函数可用于处理结构化值以及Struct类。格式说明符从其字符串格式转换为编译表示形式,类似于处理正则表达式的方式。转换需要一些资源,因此在创建Struct实例并在实例上调用方法而不是使用模块级函数时,通常更有效。以下所有示例都使用Struct该类。包装和拆包Structs支持将数据打包成字符串,并使用格式说明符从字符串中解压缩数据,格式说明符由表示数据类型和可选计数和字节顺序指示符的字符组成。有关支持的格式说明符的完整列表,请参阅标准库文档。在此示例中,说明符调用整数或长整数值,双字节字符串和浮点数。包含格式说明符中的空格以分隔类型指示符,并在编译格式时忽略。struct_pack.pyimportstructimportbinasciivalues=(1,ab.encode(utf-8),2.7)s=struct.Struct(I2sf)packed_data=s.pack(*values)print(Originalvalues:,values)print(Formatstring:,s.format)print(Uses:,s.size,bytes)print(PackedValue:,binascii.hexlify(packed_data))该示例将打包值转换为十六进制字节序列以进行打印binascii.hexlify(),因为某些字符为空。$python3struct_pack.pyOriginalvalues:(1,bab,2.7)Formatstring:bI2sfUses:12bytesPackedValue:bcdcc2c40用于unpack()从其打包表示中提取数据。struct_unpack.pyimportstructimportbinasciipacked_data=binascii.unhexlify(bcdcc2c40)s=struct.Struct(I2sf)unpacked_data=s.unpack(packed_data)print(UnpackedValues:,unpacked_data)将打包值传递给unpack(),返回基本相同的值(注意浮点值的差异)。$python3struct_unpack.pyUnpackedValues:(1,bab,2.70047683)字节顺序默认情况下,使用本机C库的字节序概念对值进行编码。通过在格式字符串中提供显式字节序指令,可以轻松覆盖该选项。struct_endianness.pyimportstructimportbinasciivalues=(1,ab.encode(utf-8),2.7)print(Originalvalues:,values)endianness=[(,native,native),(=,native,standard),(,little-endian),(,big-endian),(!,network),]forcode,nameinendianness:s=struct.Struct(code+I2sf)packed_data=s.pack(*values)print()print(Formatstring:,s.format,for,name)print(Uses:,s.size,bytes)print(PackedValue:,binascii.hexlify(packed_data))print(UnpackedValue:,s.unpack(packed_data))下表列出了使用的字节顺序说明符Struct。struct的字节顺序说明符码含义本地订单=原生标准小尾数大端!网络订单$python3struct_endianness.pyOriginalvalues:(1,bab,2.7)Formatstring:bI2sffornative,nativeUses:12bytesPackedValue:bcdcc2c40UnpackedValue:(1,bab,2.70047683)Formatstring:b=I2sffornative,standardUses:10bytesPackedValue:bcdcc2c40UnpackedValue:(1,bab,2.70047683)Formatstring:bI2sfforlittle-endianUses:10bytesPackedValue:bcdcc2c40UnpackedValue:(1,bab,2.70047683)Formatstring:bI2sfforbig-endianUses:10bytesPackedValue:b00016162ccccdUnpackedValue:(1,bab,2.70047683)Formatstring:b!I2sffornetworkUses:10bytesPackedValue:b00016162ccccdUnpackedValue:(1,bab,2.70047683)缓冲区使用二进制打包数据通常保留用于对性能敏感的情况或将数据传入和传出扩展模块。通过避免为每个打包结构分配新缓冲区的开销,可以优化这些情况。该pack_into()和unpack_from()方法支持直接写入预先分配给缓冲区。struct_buffers.pyimportarrayimportbinasciiimportctypesimportstructs=struct.Struct(I2sf)values=(1,ab.encode(utf-8),2.7)print(Original:,values)print()print(ctypesstringbuffer)b=ctypes.create_string_buffer(s.size)print(Before:,binascii.hexlify(b.raw))s.pack_into(b,0,*values)print(After:,binascii.hexlify(b.raw))print(Unpacked:,s.unpack_from(b,0))print()print(array)a=array.array(b,b\0*s.size)print(Before:,binascii.hexlify(a))s.pack_into(a,0,*values)print(After:,binascii.hexlify(a))print(Unpacked:,s.unpack_from(a,0))该size属性Struct告诉我们缓冲区需要多大。$python3struct_buffers.pyOriginal:(1,bab,2.7)ctypesstringbufferBefore:bAfter:bcdcc2c40Unpacked:(1,bab,2.70047683)arrayBefore:bAfter:bcdcc2c40Unpacked:(1,bab,2.70047683)