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

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

root4年前 (2021-11-01)python2426


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

分享给朋友:

相关文章

自定义logger 模块使调用打印日志的文件为调用文件而不是logger模块

更新logging 源码1248行f f f.f_back替换为f f f.f_back     f_2 f.f_back   ...

python 的configparser 读取配置文件遇到%特殊符号

test.ini 配置文件中有mysql的密码,且密码含有“%”这个特殊符号因为%在py是转义符的含义需要对该字符转义即修改  %  为 %%用%对%进行转义...

cmd启动python交互模式 出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x9a in position 533

这是因为在python交互模式的中输出了中文,且是个输出被记录在.python_history中删除历史记录文件C:\Users\Administrator\.python_history...

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用requests发送模拟请求忽略https的认证,忽略警告

import warnings warnings.filterwarnings('ignore')在文件头添加忽略警告信息的输出r = requests.get('https://kyfw.12306.cn&#...