当前位置:首页 > python > 正文内容

Python中struct.pack()和struct.unpack()用法详细说明

root5年前 (2021-11-01)python2969


python 中的struct主要是用来处理C结构数据的,读入时先转换为Python的 字符串 类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~。一般输入的渠道来源于文件或者网络的二进制流


struct.pack()和struct.unpack()

在转化过程中,主要用到了一个格式化字符串(format strings),用来规定转化的方法和格式


struct.pack(fmt,v1,v2,.....)

将v1,v2等参数的值进行一层包装,包装的方法由fmt指定。被包装的参数必须严格符合fmt。最后返回一个包装后的字符串


struct.unpack(fmt,string)

顾名思义,解包。比如pack打包,然后就可以用unpack解包了。

返回一个由解包数据(string)得到的一个元组(tuple), 即使仅有一个数据也会被解包成元组。其中len(string) 必须等于 calcsize(fmt)

这里面涉及到了一个calcsize函数。struct.calcsize(fmt):这个就是用来计算fmt格式所描述的结构的大小


格式字符串(format string)由一个或多个格式字符(format characters)组成,对于这些格式字符的描述参照

1489651194364318.png

示例代码

import  struct
# native byteorder
buffer  =  struct.pack( "@ihh" ,  1 ,  2 ,  3 )
print  (repr ( buffer ))
print  (struct.unpack( "@ihh" ,  buffer ))
# data from a sequence, network byteorder
data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( "=ihh" ,  * data)
print  (repr ( buffer ))
print  (struct.unpack( "=ihh" ,  buffer ))

data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( ">ihh" ,  * data)
print  (repr ( buffer ))
print  (struct.unpack( ">ihh" ,  buffer ))

data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( "<ihh" ,  * data)
print  (repr ( buffer ))
print  (struct.unpack( "<ihh" ,  buffer ))

结果:

b'\x01\x00\x00\x00\x02\x00\x03\x00'

(1, 2, 3)

b'\x01\x00\x00\x00\x02\x00\x03\x00'

(1, 2, 3)

b'\x00\x00\x00\x01\x00\x02\x00\x03'

(1, 2, 3)

b'\x01\x00\x00\x00\x02\x00\x03\x00'

(1, 2, 3)

我的电脑默认是小端模式


在Format string 的首位,有一个可选字符来决定大端和小端

列表如下

1489651251295307.png


大小端模式:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

通俗点说把存储结构当做列表,存储的单元是正序排列还是倒序排列的。

例如:

data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( ">iii" ,  * data)
print  (repr ( buffer ))
print  (struct.unpack( ">iii" ,  buffer ))

data  =  [ 1 ,  2 ,  3 ]
buffer  =  struct.pack( "<iii" ,  * data)
print  (repr ( buffer ))
print  (struct.unpack( "<iii" ,  buffer ))

结果:

b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03'

(1, 2, 3)

b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'

(1, 2, 3)


大小端百度百科

参考文档


扫描二维码推送至手机访问。

版权声明:本文由一叶知秋发布,如需转载请注明出处。

本文链接:https://zhiqiu.top/?id=171

分享给朋友:

相关文章

centos7 python2安装psutil

[root@internet geo_server]# pip install psutilDEPRECATION: Python 2.7 reached th...

falsk &django +uwsgi 的配置文件

flask的uwsgi配置文件[uwsgi]pythonpath=/usr/bin/python3  #uwsgi采用的py版本,如果项目采用的py版本跟系统默认一直可以不用写base=/***/***/***  &nb...

selenium控制webdriver  设置请求头。只能设置简单的。自定义和固定的格式无法修改成功

selenium控制webdriver 设置请求头。只能设置简单的。自定义和固定的格式无法修改成功

time selenium webdriver options webdriver.() options.() options.( options.() browser webdriver....

python csvw格式文件转parquet格式文件

用到的包: pandas    pyarrow    pandas pd df pd.(,,) df.()要求csv文件 要有头行一定要安装pyarro...

flask 服务添加ssl 证书

flask 服务添加ssl 证书

1、利用openssl生成自用的ssl证书利用openssl 生成证书openssl genrsa -des3 -out server.key 2048不要密码:再执行 一下:openssl rsa -in server.key -out...

python 之optparse模块OptionParser

该模块让python脚本命令能够符合标准的Unix命令例程式每个命令行参数就是由参数名字符串和参数属性组成的。如 -f 或者 file 分别是长短参数名当你将所有的命令行参数都定义好了的时候,我们需要调用parse_args()方法赖际熙a...