Python3.4.3使用struct模块的pack、unpack对字节数据的处理(压包,解包)

来源:赵克立博客 分类: Python 标签:Python发布时间:2016-08-06 21:33:42最后更新:2019-05-12 09:33:11浏览:23620
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-05-12 09:33:11
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

struct模块中主要有三个方法

  1. struct.pack(fmt,v1,v2,v3...)     按fmt这个格式把后面数据给封装成指定的数据

    返回一个包含了v1,v2等的字节对象,数据是通过fmt格式化后的。参数必须和fmt需要格式化的完全对应起来

  2. struct.unpack(fmt,buff)            按fmt这个格式把字节流转成原组tuple

    pack的逆向操作,只有一个对象也返回tuple。

  3. struct.calcsize(fmt)                  计算给定的fmt格式占用多少字节的内存

    根据fmt的格式,返回需要的字节大小


下面是fmt这个格式python3.4.3的说明:(如果版本有更新请查看最新的)

https://docs.python.org/3/library/struct.html#format-characters

QQ截图20160806223854.png

如下代码

#视频加密
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)


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python