Python3.4.3使用struct模块的pack、unpack对字节数据的处理(压包,解包)
struct模块中主要有三个方法
struct.pack(fmt,v1,v2,v3...) 按fmt这个格式把后面数据给封装成指定的数据
返回一个包含了v1,v2等的字节对象,数据是通过fmt格式化后的。参数必须和fmt需要格式化的完全对应起来
struct.unpack(fmt,buff) 按fmt这个格式把字节流转成原组tuple
pack的逆向操作,只有一个对象也返回tuple。
struct.calcsize(fmt) 计算给定的fmt格式占用多少字节的内存
根据fmt的格式,返回需要的字节大小
下面是fmt这个格式python3.4.3的说明:(如果版本有更新请查看最新的)
https://docs.python.org/3/library/struct.html#format-characters
如下代码
#视频加密 f = open('1.mp4', 'rb') f2=open('2.mp4','wb') try: while True: data = f.read(4) if not data: break #解码出一个字节为integer类型 data=struct.unpack('i',data) print(data) #再把这个整形数据加1后再转成字节类型数据,保存到文件中 bit=struct.pack('i',data[0]+1) print(bit) f2.write(bit) finally: f.close( ) f2.close()
上面示例中:
功能为把一个视频文件按每4个字节取出来转成int类型然后加1,再转成字节类型保存到文件中,实现一个简单的文件加密
解密方法同样是把上面中的加1改成减1就还原成正常的文件啦
struct.pack()的使用方法
比如我们要把一个字符串 HTTP/1.1 200 OK 转成字节流形式的数据
data=struct.pack('9si2s',b'HTTP/1.1 ',200,b'OK')
9s代表9个字符,i代表是个整形,2s又是两个字符,后面的数据和前面的格式是对应的
同样转成字节流后,也需要把字节按一定的格式恩成我们想要的数据
data=struct.pack('9si2s',data)
同样的,格式字符串要正确否则会出现错误
把数据转成二进制字节
import struct a=12.34 # 将a变为二进制 by=struct.pack('d',a) print(by)
输出 b'\xaeG\xe1z\x14\xae(@'
把字节转成int数据
import struct bs = b'\xc4\xe3\xc4\xe3' st=struct.unpack('i',bs) print(st)
i 代表int类型4个字节
输出(-473635900,)
import struct bs = b'\xc4\xe3\xc4\xe3' st=struct.unpack('h',bs) print(st)
上面把格式写成h(short)类型 占二个字节但bs是四个字节所以,这里就会报错
struct.error: unpack requires a bytes object of length 2
如果改成2h(两个short类型)这样就表示啦四个字节的格式
import struct bs = b'\xc4\xe3\xc4\xe3' st=struct.unpack('2h',bs) print(st)
输出如下
(-7228, -7228)