`

Python: struct.pack_into 和 struct.unpack_from 函数学习

阅读更多

一、 函数定义

 

struct.pack_into(fmt, buffer, offset, v1, v2, ...)

Pack the values v1, v2, ... according to the format string fmt and write the packed bytes into the writable buffer buffer starting at position offset. Note that offset is a required argument.

按照指定的格式fmt,将v1,v2...打包到buffer中,其中偏移位置为offset

 

struct.unpack_from(fmt, buffer, offset=0)

Unpack from buffer starting at position offset, according to the format string fmt. The result is a tuple even if it contains exactly one item. The buffer’s size in bytes, minus offset, must be at least the size required by the format, as reflected by calcsize().

按照指定的格式fmt,从偏移位置offset开始解包,返回数据格式是一个元组(v1,v2...)

 

二、简单的脚本示例

 

from ctypes import create_string_buffer
import struct
import binascii

#创建了一个7个字节长度的buffer
buffer = create_string_buffer(7)

#开始打包
#偏移位置0,打包格式!B,打包数据10,10按照1个字节长度打包为0x0a
#执行后,buffer变为:0a000000000000
struct.pack_into('!B', buffer, 0, 10) 
#偏移位置1,打包格式!H,打包数据11,11按照2个字节长度打包为0x000b
#执行后,buffer变为:0a000b00000000
struct.pack_into('!H', buffer, 1, 11)
#偏移位置3,打包格式!I,打包数据12,12按照4个字节长度打包为0x0000000c
#执行后,buffer变为:0a000b0000000c
struct.pack_into('!I', buffer, 3, 12) 
#输出结果:0a000b0000000c
print binascii.hexlify(buffer) 

#开始解包
p1 = struct.unpack_from('!B',buffer,0)
p2 = struct.unpack_from('!H',buffer,1)
p3 = struct.unpack_from('!I',buffer,3)
print p1,p2,p3
print p1[0],p2[0],p3[0]
#输出结果:
#(10,)(11,)(12,)
#10 11 12

 

 三、函数的应用场景

 

接口测试的主要流程:打包-->发包-->收包-->解包-->校验。当传输的是二进制数据时,我们就需要用到struct模块来完成打包和解包的工作。一般情况下,使用struct.pack和struct.unpack就可以了。

 

但是很多情况下,为了满足特定应用的需要,开发人员会使用自定义协议。(自定义协议可以理解为一个由特定数据按照特定格式组织的,在特定网络系统中传输的字符串。它由多个字段组成,每个字段表示特定的含义,并且字段之间的顺序是固定的。服务器端和客户端传输数据时,可以根据事先定义的协议字段含义及顺序解析出数据进行相应处理。)自定义协议的接口测试,需要按照协议规定的顺序以及格式拼接各个字段,这时就需要用到struct.pack_into和struct.unpack_from函数了,它们可以只针对buffer中的一部分内容进行打包和解包。

 

 

 

 

 

分享到:
评论

相关推荐

    python.struct_helper_0_01

    `struct`模块的核心在于它的`pack`和`unpack`函数。`pack`函数用于将Python值转化为字节串,而`unpack`函数则将字节串解码为Python值。格式字符串是用来指定如何进行转换的关键,它们由一系列的字母数字字符组成,...

    tbsp_struct.rar_oracle

    `tbsp_struct.rar_oracle`这个压缩包文件,根据其标题和描述,应该包含了一个PL/SQL脚本,用于展示Oracle数据库中的表空间结构。下面我们将深入探讨Oracle表空间的概念,以及如何通过PL/SQL代码来获取这些信息。 **...

    mapstruct-1.3.1.Final-API文档-中英对照版.zip

    赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...

    PIC-struct.rar_pic struct_pic的struct_单片机结构体

    本资料"PIC-struct.rar"主要针对PIC单片机,详细讲解了如何在C编程环境中定义和使用结构体。 在标题“PIC-struct.rar_pic struct_pic的struct_单片机结构体”中,我们可以推测内容可能涉及以下几个关键点: 1. **...

    python的struct模块.docx

    `struct.pack_into()` 和 `struct.unpack_from()` 这两个函数主要用于直接操作内存中的字节序列。它们允许在特定的内存位置打包或解包数据,这对于性能优化非常有用。 **示例**: ```python import struct from ...

    adder_sub_struct.rar_adder_adder_sub_struct_sub_vhd_vhdl

    标题中的"adder_sub_struct.rar_adder_adder_sub_struct_sub_vhd_vhdl"表明这是一个关于VHDL编程的项目,具体是实现加法器(adder)和减法器(subtractor)的结构化设计。VHDL是一种硬件描述语言,常用于数字逻辑...

    python_use_c_dll.zip_C python_dll_python_python dll_python示例

    1. **ctypes库**:这是Python标准库的一部分,用于调用C函数库,包括加载和使用DLL。使用ctypes,我们可以定义C数据类型,如int、double、char*等,并将它们映射到Python对象。此外,ctypes还支持函数指针和结构体。...

    DISPLAY(STM32).rar_STM32 数码管_STM32HAL数码管_site:www.pudn.com_stm32

    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | ... | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO...

    app_struct_pythonstruct_freeood_

    2. `struct.unpack()`函数:这个函数的作用与`pack()`相反,它将字节序列解包为Python数据类型。同样,也需要提供一个格式字符串来指示如何解析数据。例如,`struct.unpack("!I", bytes_data)`会将字节序列解包为一...

    Data_struct.rar_Data Struct_visual c

    在"Data_struct.rar_Data Struct_visual c"这个资源中,我们主要会探讨如何使用Visual C++来理解和实现数据结构。 数据结构主要包括数组、链表、栈、队列、树、图以及哈希表等多种类型。每种数据结构都有其独特的...

    LED.rar_STM151 HAL_STM32c8t6点灯_hal点灯_stm32L1 spi_stm32l15x

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 选择PA0 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 设置为输出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出 GPIO_InitStruct.GPIO_PuPd = GPIO_...

    file_to_struct.rar_结构体

    本示例“file_to_struct.rar_结构体”探讨了如何将结构体存储到文件中,然后从文件中读取,这是在进行数据持久化或跨程序传递数据时常见的操作。下面我们将深入探讨这一主题。 1. **结构体定义**: 在C语言中,...

    对python 自定义协议的方法详解

    这里的关键是使用`struct.unpack`和`struct.unpack_from`函数来解析二进制数据。注意,当读取字符串时,我们需要对其进行解码操作。 ##### 3.3 构建包 下面是如何构建一个符合协议的数据包的例子: ```python key...

    ssdt_hook.rar_ssdt_ssdt hook_ssdt_hook_struct.h

    综上所述,"ssdt_hook.rar"提供的内容可能包含了一个完整的SSDT Hook实现,包括初始化SSDT表的"InitServicesTable()"函数和实际挂钩服务的"HookService()"函数。学习和理解这部分内容,可以帮助我们深入了解操作系统...

    ptr_struct_file.c与buff_type_test.c_ptr_struct_file_源代码_buff_type

    在给定的压缩包文件中,我们有两个C语言源代码文件——`ptr_struct_file.c`和`buff_type_test.c`。这些文件主要涉及到Linux环境下的程序...通过深入分析和学习这两个文件,可以增强对C语言编程的理解和实际应用能力。

    ReadFile.rar_Python获取通达信日线数据_python readFile_tdx_tentmev_通达信

    标题“ReadFile.rar_Python获取通达信日线数据_python readFile_tdx_tentmev_通达信”表明我们的任务是利用Python脚本(如`ReadFile.py`)来读取和处理通达信中的日线数据。`readFile`可能是指我们编写的一个函数或...

    learn_struct_K2.zip_k2算法_learn_struct_k2_贝叶斯_贝叶斯网络_贝叶斯网络k2

    总结来说,K2算法是贝叶斯网络结构学习的重要工具,通过"learn_struct_K2.m"的代码,我们可以实现对离散数据的贝叶斯网络建模,为数据分析和决策提供有力支持。理解和掌握这一算法,不仅有助于提升数据建模能力,也...

    使用C#拷贝String到struct.rar_struct

    在C#编程中,结构(struct)是一种值类型,它用于定义包含一组数据成员的自定义类型。与类(class)不同,struct是栈分配的,而类是堆分配的。在某些场景下,比如处理大量小对象或者需要高效内存操作时,使用struct...

    nested_struct.rar_Different

    Check structure passing with different structure size. Contains structs as parameter of the struct itself.

    segy_struct.zip_segy_segy_struct_地震segy_结构地震

    segy格式文件的结构化,用于地震资料的处理。matlab文件。

Global site tag (gtag.js) - Google Analytics