当我们需要传递多个参数时,如果每个参数都要单独传递,会变得很麻烦。Python的pack函数就可以帮助我们将参数打包成一个元组。
pack函数的语法为:pack(format, v1, v2, ...)
其中,format
是格式化字符串,用于指明每个参数的类型。v1, v2, ...
是要打包的参数。
下面是一些常用的格式化字符串及其含义:
格式化字符串 | 含义 |
---|---|
i | 整型 |
f | 浮点数 |
s | 字符串 |
b | 字节数组 |
c | 字符(bytes) |
? | 布尔型 |
下面是一个例子:我们要发送一个消息,消息格式为:消息类型(1个字节)、消息长度(4个字节)、消息体(utf-8编码的字符串),我们可以使用pack函数将消息打包成二进制数据后再发送。
import struct
# 消息类型1,消息体为"Hello World"
message_type = 1
message_body = "Hello World".encode("utf-8")
message_len = len(message_body)
# 按格式打包消息
packed_data = struct.pack("!BI%ds" % message_len, message_type, message_len, message_body)
# 发送消息
sock.sendall(packed_data)
在上面的代码中,我们使用了一个格式化字符串"!BI%ds"
来指明每个参数的类型。其中,!
表示网络字节序(大端序),B
表示一个无符号字节(即一个字节,范围为0~255),I
表示一个无符号整数(4个字节,范围为0~4294967295),%ds
表示一个字符串(长度为message_len
字节)。
另一个例子是解包二进制数据。假设我们已经从网络中接收到了一个消息,消息格式与上面的发送消息格式一致,我们可以使用pack函数将消息解包成相应的参数:
import struct
# 假设收到的二进制数据保存在data变量中
message_type, message_len = struct.unpack("!BI", data[:5])
message_body = struct.unpack("%ds" % message_len, data[5:])[0].decode("utf-8")
# 处理消息
handle_message(message_type, message_body)
在上面的代码中,我们使用了两个格式化字符串。!BI
表示解包一个无符号字节和一个无符号整数,%ds
表示解包一个字符串(长度为message_len
字节)。
总结一下,pack函数的作用主要是将多个参数打包成一个二进制数据,以便于网络传输或保存到磁盘文件中。使用pack函数需要指定格式化字符串来指明每个参数的类型,然后将要打包的参数传递给pack函数即可。解包二进制数据也很简单,只需要使用相应的格式化字符串即可将二进制数据解包成多个参数。