在网络通信当中,当我们用二进制流的形式来传递数据时,需要有一种机制,使得发送端可以将数据打包再传输,接收端收到数据后能将数据解包得到原始的结构体数据。Python的struct模块就提供了这样的机制。
pack 和 unpack 关于这两个函数的官方定义如下:
struct.
pack
(fmt, v1, v2, ...)
Return a bytes object containing the values v1, v2, ... packed according to the format string fmt. The arguments must match the values required by the format exactly.
struct.
unpack
(fmt, buffer)
Unpack from the buffer buffer (presumably packed by pack(fmt, ...)
) according to the format string fmt. The result is a tuple even if it contains exactly one item. The buffer’s size in bytes must match the size required by the format, as reflected by calcsize()
.
下面我们通过代码来看看具体如何使用:
# -*- coding:utf-8 -*- import struct import binascii pack_str1 = struct.pack('!2H',10,100) pack_str2 = struct.pack('2H',10,100) print pack_str1, pack_str2 #乱码 print binascii.hexlify(pack_str1) #000a0064 print binascii.hexlify(pack_str2) #0a006400 print len(pack_str1) #4 a1,a2 = struct.unpack('!2H', pack_str1) print a1,a2 #10 100
代码中的‘!2H’即format,struct.pack和struct.unpack都是按照format进行打包和解包的,10和100打包的结果分别是000a和0064,其本质是字节流,但其容器是str,且长度一共是4个字节。其中!表示按照网络的对齐方式(大端)。
注:大端指较低的有效字节存放在较高的存储器地址中,较高的有效字节存放在较低的存储器地址;小端则相反。大小端的主要区别在于字节存放的顺序,采用大端更符合人的思维逻辑,采用小端更利于计算机处理。
Format | C Type | Python Type | Standard size |
B | unsigned char | integer | 1 |
H | unsigned short | integer | 2 |
I | unsigned int | integer | 4 |
待续
参考:https://docs.python.org/3/library/struct.html#module-struct
相关推荐
`struct.pack_into()` 和 `struct.unpack_from()` 这两个函数主要用于直接操作内存中的字节序列。它们允许在特定的内存位置打包或解包数据,这对于性能优化非常有用。 **示例**: ```python import struct from ...
`struct`模块包含了三个关键函数:`pack()`、`unpack()`和`calcsize()`。 1. `pack(fmt, v1, v2, ...)`: 这个函数用于将一系列值根据指定的格式`fmt`打包成一个字节串。`fmt`是一个包含格式代码的字符串,用于定义...
它主要通过两种函数:`pack`和`unpack`来完成这些操作。 1. `pack(format, v1, v2, ...)`: 这个函数将一组Python值按照指定的格式转换为字节串。格式字符串定义了要转换的数据类型。 2. `unpack(format, byte_...
这个模块提供了`pack`、`unpack`和`calcsize`等方法,让我们能够将Python的数据类型转化为字节序列,并从字节序列中恢复数据。 `struct.pack`方法用于将Python的值按照指定的格式(format string)打包成字节序列。...
4. **数据打包和解包**:`struct.pack(format, v1, v2, ...)`函数将Python值按照指定的格式打包成字节串。格式字符串描述了数据的类型和顺序,如`'ii'`表示两个无符号整数。`struct.unpack(format, bytes)`则相反,...
struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string) 按照给定的格式(fmt)解析...
综上所述,"app_struct_pythonstruct_freeood_"项目展示了如何利用Python的`struct`库来处理IP地址的整数表示和字符串表示之间的转换。这种转换在处理网络数据、IP路由、IP包解析等场景中非常常见。熟悉`struct`库的...
`struct`模块的核心在于它的`pack`和`unpack`函数。`pack`函数用于将Python值转化为字节串,而`unpack`函数则将字节串解码为Python值。格式字符串是用来指定如何进行转换的关键,它们由一系列的字母数字字符组成,...
- **`struct.unpack()`函数**:用于从字节流中提取出Python变量。 - 参数同样是一个格式化字符串,指定要解包的字节流的格式。 - 返回一个元组,包含解包后的Python变量。 #### 结论 通过对上述内容的详细分析,...
接着,`pack`和`unpack`函数是`struct.nim`模块的关键,它们用于将结构体实例转换为字节序列(打包)和从字节序列还原结构体实例(解包)。这两个函数支持指定字节顺序(endianness),这对于跨平台操作非常有用。...
这里的关键是使用`struct.unpack`和`struct.unpack_from`函数来解析二进制数据。注意,当读取字符串时,我们需要对其进行解码操作。 ##### 3.3 构建包 下面是如何构建一个符合协议的数据包的例子: ```python key...
可以使用 Python 的 socket 和 struct 模块来实现 IP 地址和整数之间的互转换。例如: ``` import socket import struct def ip_to_int(ip): return struct.unpack("!I", socket.inet_aton(ip))[0] def int_to_ip...
总之,`pickle`模块和`struct`模块都是Python中非常实用的工具,它们分别针对序列化/反序列化和字节流处理提供了强大的支持。掌握这两个模块的基本用法,可以帮助开发者更好地处理数据存储和传输等问题。
`struct.unpack`函数的作用与`struct.pack`相反,它是将字节流转换回Python的数据类型。其基本语法为: ```python struct.unpack(fmt, byte_str) ``` - `fmt`:指定字节流中的数据格式。 - `byte_str`:待转换的字节...
总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string...
以上便是对Jython学习资料中关于Python标准库struct模块的详细解析。在使用struct模块时,理解格式化字符串的使用和不同数据类型的转换是核心,这能帮助开发者在处理二进制数据时更为精准高效。另外,虽然上述内容...
dir(struct) # 输出:['__doc__', '__name__', 'calcsize', 'error', 'pack', 'unpack'] ``` 12. enumerate(iterable):返回 enumerate 对象。iterable 必须是一个序列、一个迭代、或者其他支持迭代的对象。 例如:...
例如,在Python中,可以使用内置的`struct`模块的`pack`和`unpack`函数进行二进制转换: ```python import struct # 创建单精度浮点数 float_value = 3.14 # 将浮点数转换为32位二进制字符串 binary_float = ...
在Python编程中,`pack`和`unpack`是`struct`模块中的两个关键函数,用于处理不同数据类型的字节序列转换。这两个函数在跨语言通信、数据存储或网络传输等场景中尤其有用,因为它们可以帮助我们将Python对象转换为...
data = struct.pack("i", 42) ``` 要解析这个二进制数据回整数,可以使用`unpack()`函数: ```python value = struct.unpack("i", data)[0] ``` 在这里,"i"是格式说明符,代表一个有符号的整数。不同的...