python
struct模块
Python为各种数据类型(如整型等)提供与“C”不同的抽象层次,它们也以不同的方式存储它们。当然,存储在二进制文件中的数据或通过网络发送和接收的数据是连续的字节。在Python中,列表中的数据可能不会被存储为连续的字节块。
为了处理它们,将python值转换为“C”结构很重要,即将它们打包成连续的数据字节,或者将一个连续的字节块分解成Python对象。模块“struct”提供了将python对象打包为连续的字节块的功能,或者将一大块字节拆分成python结构。
struct模块中最重要的二个函数是pack(), unpack():(1)打包:struct.pack(fmt, v1, v2, …)(2)解包:struct.unpack(fmt, buffer)
struct中支持的格式字符(fmt)如下表。
字节顺序,大小和对齐。默认情况下,C类型以机器的本机格式和字节顺序表示,并且如果必要,通过跳过填充字节(根据C编译器使用的规则)正确对齐。或者,根据下表,格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐。使用方法是放在fmt的第一个位置,就像'@5s5sif'。
打包函数(struct.pack)。打包函数采用格式字符和一个或多个参数,并返回二进制字符串。 这看起来非常像格式化字符串,除了输出不是字符串,而是字节块。
网络字节顺序。您也可以使用网络字节顺序将其发送到网络。
比如有一个C结构体。
解包。通过socket.recv接收到了一个上面的结构体数据,存在字符串buffer中,现在需要把它解析出来,可以使用unpack()函数:id, name = struct.unpack("!ic", buffer)。上面的格式字符串中,!表示我们要使用网络字节顺序解析,因为我们的数据是从网络中接收到的,在网络上传送的时候它是网络字节顺序的。后面的i表示 一个int的id,c表示一个char的name。
打包。就通过一个unpack,现在id, name里已经保存好我们的信息了。同样,也可以很方便的把本地数据再pack成struct格式。buffer = struct.pack("!ic", id, name)。pack函数就把id, name按照指定的格式转换成了结构体,buffer 现在是一个字符串(实际上是类似于c结构体的字节流),可以通过 socket.send(buffer )把这个字符串发送出去.
多数据构成。如下图
分析。此时的binary就是二进制形式的数据了,可以直接写入文件比如 file.write(binary)。然后,当我们需要时可以再读出来,binary=file.read()。也可以通过struct.unpack()解码成python变量,a,b,c,d=struct.unpack('5s5sif',binary),'5s5sif'这个叫做fmt,就是格式字符串,由数字加字符构成,5s表示占5个字符的字符串,i表示整数,f表示浮点数。