python pack函数的作用_python中struct.pack()函数和struct.unpack()函数的详细介绍

本文介绍了Python中struct模块处理C结构数据的方法。主要涉及struct.pack()和struct.unpack()函数,前者用于包装参数,后者用于解包。还提到了格式化字符串规定转换方法和格式,以及calcsize函数计算结构大小,最后给出代码示例并讲解大小端模式。

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

1.struct.pack()和struct.unpack()

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

下面来谈谈主要的方法:

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

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

1.2 struct.unpack(fmt,string)

顾 名思义,解包。比如pack打包,然后就可以用unpack解包了。返回一个由解包数据(string)得到的一个元组(tuple), 即使仅有一个数据也会被解包成元组。其中len(string) 必须等于 calcsize(fmt),这里面涉及到了一个calcsize函数。struct.calcsize(fmt):这个就是用来计算fmt格式所描述的结构的大小。

格式字符串(format string)由一个或多个格式字符(format characters)组成,对于这些格式字符的描述参照Python manual如下 Formatc TypePythonNotexpad byteno value

ccharstring of length 1

bsignedcharinteger

Bunsignedcharinteger

?_Boolbool(1)

hshortinteger

Hunsignedshortinteger

iintinteger

Iunsignedintinteger or long

llonginteger

Lunsignedlonglong

qlonglonglong(2)

Qunsignedlonglonglong(2)

ffloatfloat

ddoublefloat

schar[]string

pchar[]string

Pvoid*long

2.代码示例

import struct

# native byteorder

buffer = struct.pack("ihb", 1, 2, 3)

print repr(buffer)

print struct.unpack("ihb", buffer)

# data from a sequence, network byteorder

data = [1, 2, 3]

buffer = struct.pack("!ihb", *data)

print repr(buffer)

print struct.unpack("!ihb", buffer)

Output:

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

(1, 2, 3)

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

(1, 2, 3)

View Code

首 先将参数1,2,3打包,打包前1,2,3明显属于python数据类型中的integer,pack后就变成了C结构的二进制串,转成 python的string类型来显示就是  '\x01\x00\x00\x00\x02\x00\x03'。由于本机是小端('little- endian',关于大端和小端的区别请参照这里, 故而高位放在低地址段。i 代表C struct中的int类型,故而本机占4位,1则表示为01000000;h 代表C struct中的short类型,占2位,故表示为0200;同理b 代表C struct中的signed char类型,占1位,故而表示为03。

其他结构的转换也类似,有些特别的可以参考官方文档的Manual。

在Format string 的首位,有一个可选字符来决定大端和小端,列表如下:@nativenative

=nativestandard

>big-endianstandard

!network (= big-endian)standard

如果没有附加,默认为@,即使用本机的字符顺序(大端or小端),对于C结构的大小和内存中的对齐方式也是与本机相一致的(native),比如有的机器integer为2位而有的机器则为四位;有的机器内存对其位四位对齐,有的则是n位对齐(n未知,我也不知道多少)。

还有一个标准的选项,被描述为:如果使用标准的,则任何类型都无内存对齐。

比如刚才的小程序的后半部分,使用的format string中首位为!,即为大端模式标准对齐方式,故而输出的为'\x00\x00\x00\x01\x00\x02\x03',其中高位自己就被放在内存的高地址位了。

更多python中struct.pack()函数和struct.unpack()函数的详细介绍相关文章请关注PHP中文网!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

### struct.pack struct.unpack 的使用方法及区别 `struct.pack` `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信文件格式解析等场景。 #### struct.pack 的使用方法 `struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符可选的字节顺序、大小对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 示例代码如下: ```python import struct # 使用大端模式打包两个整数两个字节 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' ``` #### struct.unpack 的使用方法 `struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包为 Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误或数据不一致。 示例代码如下: ```python import struct # 解包之前打包的数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` #### struct.pack struct.unpack 的区别 `struct.pack` `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序大小的场景,例如网络协议数据的编码解码。 此外,`struct.pack` `struct.unpack` 与字符串的 `encode` `decode` 方法不同。后者用于在文本数据字节流之间进行转换,而前者用于在二进制数据 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。 #### 格式字符串的规则 格式字符串由格式字符、数量前缀字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 #### 注意事项 - 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。 - 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。 - `struct.pack` `struct.unpack` 支持的数据类型有限,主要适用于数值类型固定长度的字符串。 - 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。 --- ### 示例代码 ```python import struct # 打包数据 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' # 解包数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` --- ### 相关问题 1. 如何使用 struct 模块处理 C 语言结构体? 2. 如何在 Python 中使用 struct 模块解析网络协议数据? 3. struct.pack struct.unpack 如何处理浮点数? 4. 如何使用 struct 模块处理变长字符串?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值