这两天做TCP协议,数据的传输都是二进制的,需要解释,于是用到了struct
看到这样一句代码:
length = struct.unpack('>I', self.buffer[:4])[0]
当时没有明白format=">I"是什么意思,从google找了一下,有人说这个东西,可都是比较笼统,没能让我明白,于是硬着头皮看API:
By default, C numbers are represented in the machine’s native format and byte order, and properly aligned by skipping pad bytes if necessary (according to the rules used by the C compiler).
通常,C语言下数字都是机器语言的格式并且按照字节排序,同时在需要的情况下会利用跳过填补的字节来进行适当的调整
Alternatively, the first character of the format string can be used to indicate the byte order, size and alignment of the packed data。
非此即彼:字符串的第一个字符要么被用于表示字符串的字节的排序,或者是字符串的size,还有就是数据是否对准。
Native byte order is big-endian or little-endian, depending on the host system. For example, Motorola and Sun processors are big-endian; Intel and DEC processors are little-endian.
计算机的字节序要么是高位顺序,要么是低位的,这依赖于主机本身。比如,摩托罗拉和sun的处理器是高位的,但是intel和DEC的是低位的。
这样子就明白了上面的format=">I"的意思,也就是说按照高位顺序来格式化取得一个int或long值。下面问题就又来了,你怎么知道读取的就是一个int或long值呢?
通过看struct的文档,可以看到struct通过两张表制定了一定的format规则,我按照自己的观察,给他归纳为两类,一个是和C当中类型的对照,另一个就是选择按照高位还是低位来解释字节。上面已经说了高低字节顺序,那么观察和C对照的表格,发现I 代表的就是integer or long ,详细的可以去看python的API。
下面是一些使用的例子,具体的使用,可以参考这些例子:
1. 设置fomat格式,如下:
# 取前5个字符,跳过4个字符华,再取3个字符
format = '5s 4x 3s'
2. 使用struck.unpack获取子字符串
import struct
print struct.unpack(format, 'Test astring')
#('Test', 'ing')
来个简单的例子吧,有一个字符串'He is not very happy',处理一下,把中间的not去掉,然后再输出。
import struct
theString = 'He is not very happy'
format = '2s 1x 2s 5x 4s 1x 5s'
print ' '.join(struct.unpack(format, theString))
输出结果:
He is very happy
随后是关于网络字节的东东,从网上看来的,感觉有用:
Python的socket库采用string类型来发送和接收数据,这样当我们用
i = socket.recv(4)
来接收一个4字节的整数时,该整数实际上是以二进制的形式保存在字符串 i 的前4个字节中;大多数的时候我们需要的是一个真正的integer/long型,而不是一个用string型表示的整型。这时我们可以使用struct库:Interpret
strings as packed binary data. 对上面的情况,我们可以写
t = unpack("I", i)
第一个参数是格式化字符串,I指明字符串 i 包含的头一个数据项是一个以C语言的unsigned integer表示的整数,这里 i 只包含了一个数据项,实际上这个被解释的字符串也可以包含多个数据项,只要在格式化字符串里为每项数据指明一个格式即可;自然地,unpack返回的就是一个tuple类型了。
- 大小: 20.5 KB
分享到:
相关推荐
`struct`模块包含了三个关键函数:`pack()`、`unpack()`和`calcsize()`。 1. `pack(fmt, v1, v2, ...)`: 这个函数用于将一系列值根据指定的格式`fmt`打包成一个字节串。`fmt`是一个包含格式代码的字符串,用于定义...
在Python编程中,`pack`和`unpack`是`struct`模块中的两个关键函数,用于处理不同数据类型的字节序列转换。这两个函数在跨语言通信、数据存储或网络传输等场景中尤其有用,因为它们可以帮助我们将Python对象转换为...
byte[] b = JavaStruct.pack(f); Foo f2 = new Foo(); JavaStruct.unpack(f2, b); } catch (StructException e) { } ``` 当结构体操作出错时,会抛出一个受检查的`StructException`异常。此外,JavaStruct还...
`struct.pack_into()` 和 `struct.unpack_from()` 这两个函数主要用于直接操作内存中的字节序列。它们允许在特定的内存位置打包或解包数据,这对于性能优化非常有用。 **示例**: ```python import struct from ...
总之,`pickle`模块和`struct`模块都是Python中非常实用的工具,它们分别针对序列化/反序列化和字节流处理提供了强大的支持。掌握这两个模块的基本用法,可以帮助开发者更好地处理数据存储和传输等问题。
例如,当需要将一个包含多个不同类型数据的结构体通过socket发送时,可以先用`struct.pack()`将结构体打包成字节串,然后在接收端使用`struct.unpack()`解包还原。 4. **数据打包和解包**:`struct.pack(format, v1...
2. `struct.unpack()`函数:这个函数的作用与`pack()`相反,它将字节序列解包为Python数据类型。同样,也需要提供一个格式字符串来指示如何解析数据。例如,`struct.unpack("!I", bytes_data)`会将字节序列解包为一...
`struct`模块的核心在于它的`pack`和`unpack`函数。`pack`函数用于将Python值转化为字节串,而`unpack`函数则将字节串解码为Python值。格式字符串是用来指定如何进行转换的关键,它们由一系列的字母数字字符组成,...
它主要通过两种函数:`pack`和`unpack`来完成这些操作。 1. `pack(format, v1, v2, ...)`: 这个函数将一组Python值按照指定的格式转换为字节串。格式字符串定义了要转换的数据类型。 2. `unpack(format, byte_...
这个模块提供了`pack`、`unpack`和`calcsize`等方法,让我们能够将Python的数据类型转化为字节序列,并从字节序列中恢复数据。 `struct.pack`方法用于将Python的值按照指定的格式(format string)打包成字节序列。...
struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string) 按照给定的格式(fmt)解析...
总结一下,struct模块是Python语言中处理二进制数据的核心工具之一,通过提供pack和unpack功能,可以高效地进行二进制数据和Python基本数据类型的转换。在处理二进制文件格式、网络通信和内存中的二进制数据时,...
不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转:复制代码 代码如下:string pack ( string $format [, mixed $args [, mixed $…]] ) //Pack given arguments into binary ...
pack和unpack格式字符串的语法与python的struct模块中的语法相同。 解压缩的结果是正常的数字索引数组,应从0开始像它应该的那样。 unpack的结果具有类型转换值(对于整数格式为int,对于布尔格式为bool,对于...
- `struct.pack()`函数接受一个格式化字符串和一系列变量作为参数,返回一个包含这些变量二进制表示形式的字节串。 5. **发送数据**:使用`sendto()`方法将打包好的数据发送至指定IP地址和端口。 6. **关闭socket...
这里的关键是使用`struct.unpack`和`struct.unpack_from`函数来解析二进制数据。注意,当读取字符串时,我们需要对其进行解码操作。 ##### 3.3 构建包 下面是如何构建一个符合协议的数据包的例子: ```python key...
##### `struct.pack_into` 和 `struct.unpack_from` 这两个函数提供了更高级的功能,允许直接在缓冲区中进行数据的打包和解包操作。这对于性能敏感的应用场景特别有用。 **示例**: ```python import struct from ...
接着,`pack`和`unpack`函数是`struct.nim`模块的关键,它们用于将结构体实例转换为字节序列(打包)和从字节序列还原结构体实例(解包)。这两个函数支持指定字节顺序(endianness),这对于跨平台操作非常有用。...