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

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

root3年前 (2021-11-01)python2225


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

分享给朋友:

相关文章

Python的多线程并发限制

maxConnections connection_lock (maxConnections)在开启线程前执行connection_lock.acquire()线程执行结束执行connection_lock.releas...

python 发送和发送ICMP数据包

python 发送和发送ICMP数据包

ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。对于ICMP首部细分为8位类型+8位代码+16位校验和+16位标识符+16位序列号其中类型的取值如下,我们比较关注的是...

python跟pip不是同一个版本的坑

python执行默认是Python2.7但是pip默认确实pip3的用pip install 安装包只会安装到python3环境里面指回pip vim /usr/local/bin/pip把 第一行的#!/usr/bin...

java 连接数据库的xml配置文件的位置配置问题

java 连接数据库的xml配置文件的位置配置问题

Mapper层中的xml 文件由resources文件夹调整到Mapper文件夹中失败原因1:未在pom文件中的build 标签中配置resources相关的内容范围应该配置配置文件的范围,不配置默认就是resource文件夹中可以进行如下...

Python eventlet 模块,Timeout() 控制子程序运行时间

pip install  eventlet #安装依赖包# -*- coding:utf-8 -*- import eventlet import time e...

python zip 压缩文件 解压文件

# 压缩文件 import errno import os import zipfile def zip_pack_file(target_path, zip_fi...