美文网首页
Python中Struct模块

Python中Struct模块

作者: 学而时习之_不亦说乎 | 来源:发表于2017-12-22 08:48 被阅读48次

Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8种)它只定义了六种基本类型:字符串,整数,浮点数,元组(set),列表(array),字典(key/value)通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题

我的理解是,Python将需要与其他平台进行交互的数据全部转换为字节存储,并且同时告诉对方这些字节是怎么组合起来的,这样对方才知道如何正确的拆分这些字节流。比如下面的代码:

import struct
print
buff = struct.pack('ii',4,4);          ###将两个整型数打包
str = struct.unpack('ii',buff);       ###将字节流分拆为两个整型数
print (str)            ###打印拆分结果为: (4, 4)
str2 = struct.unpack('q',buff);          ###将字节流按照long long整型数
print (str2)            ###拆分结果为:17179869188

pack方法的第一个参数为打包数据类型,也就是组合的方式,其中i表示int整型,用四个字节表示,q表示long long整型,用八个字节表示,所以我们按照ii的格式(表示两个整数)解包的时候,能够正确的将八个字节的内容拆分为两个int型整数。如果将整个八字节解读为一个long long 整型,则最后的数字为17179869188。

Python还定义了其他的字符,用来表示不同的类型,如下图所示。


我们可以使用128sl这样的方法表示128个char型和一个long型,或者2i表示两个int整型.

在了解上面的概念后对pack,unpack方法的使用应该没有问题了。但是有一点特别需要注意的是,在不同的系统中,某些相同的数据类型,使用了不同的字节数,这一点跟系统的编译器有光。比如下面为长整型(long int)数,在不同的操作系统和架构下占用的字节数:

操作系统 架构 大小
Windows IA-32 4 bytes
Windows Intel® 64 or IA-64 4 bytes
Linux IA-32 4 bytes
Linux Intel® 64 or IA-64 8 bytes
Mac OS X IA-32 4 bytes
Mac OS X Intel® 64 or IA-64 8 bytes

The Intel® Compiler is compatible and inter-operable with Microsoft* Visual C++ on Windows* and with gcc* on Linux* and Mac OS X*. Consequently, the sizes of fundamental types are the same as for these compilers.

我们可以看到,long int 类型在64位Linux系统和64位Windows系统中是不同的。我们使用下面的实验来证明:

#Linux 系统(Ubuntu 16.04)中:
import struct
print struct.calcsize('l')
#输出结果为8,说明long类型,在64位Linux系统中为8字节
#Windows 系统(Windows 10)中:
import struct
print struct.calcsize('l')
#输出结果为4,说明long类型,在64位Windows系统中为4字节

为了让其在不同系统中使用相同的解释方式,我们可以使用<来让系统采用standard而非native(native就是基于本地编译器)的方式来强制不同的系统采用相同的解释方式。

标准Size

在增加了<符号后,我们可以再次进行上面的实验。

#Linux 系统(Ubuntu 16.04)中:
import struct
print struct.calcsize('<l')
#输出结果为4
#Windows 系统(Windows 10)中:
import struct
print struct.calcsize('l')
#输出结果为4

使用非Native的方式在跨平台的时候尤其重要。

相关文章

  • Python中Struct模块

    Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8...

  • Python模块 | struct模块

    了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,c...

  • Python struct模块

    1 struct模块 pack struct.pack 用于将Python的值根据格式符号,转为字符串,注意返回的...

  • 【Python】struct 模块

    数据在计算机中存储和在网络中传输的方式各有不同。struct 模块用于 Python 值和用 Python 字节对...

  • Python Tcp数据传输

    需要用到python中的socket模块和struct模块,所以首先需要导入进来 接着是连接 在这里假设C中通讯协...

  • struct

    Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。 struct模块定义的数据类型...

  • Day15内建模块struct&hashlib&

    struct Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。struct的pa...

  • 常用内建模块2

    struct Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。struct的pa...

  • 每周一个 Python 模块 | struct

    专栏地址:每周一个 Python 模块 struct 模块包括用于在字节串和 Python 数据类型(如数字和字符...

  • python处理二进制数据

    struct 处理二进制数据离不开python的struct模块,struct理解上你可以把它理解为c语言的结构体...

网友评论

      本文标题:Python中Struct模块

      本文链接:https://www.haomeiwen.com/subject/xxxtgxtx.html