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...)

二、简单的脚本示例

扫描二维码关注公众号,回复: 379611 查看本文章
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中的一部分内容进行打包和解包。

猜你喜欢

转载自sharley.iteye.com/blog/2378245
今日推荐