在Python的struct模块中进行数据格式转换的方法


Posted in Python onJune 17, 2015

Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8种),它只定义了六种基本类型:字符串,整数,浮点数,元组,列表,字典。通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题。打个比方:C++写的客户端发送一个int型(4字节)变量的数据到Python写的服务器,Python接收到表示这个整数的4个字节数据,怎么解析成Python认识的整数呢? Python的标准模块struct就用来解决这个问题。

struct模块的内容不多,也不是太难,下面对其中最常用的方法进行介绍:
 struct.pack

struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串。v1, v2, …表示要转换的python值。下面的例子将两个整数转换为字符串(字节流):
 

import struct
 
a = 20
b = 400
 
str = struct.pack("ii", a, b) 
#转换后的str虽然是字符串类型,但相当于其他语言中的字节流(字节数组),可以在网络上传输
print 'length:', len(str)
print str
print repr(str)
 
#---- result
#length: 8
#  ----这里是乱码
#'/x14/x00/x00/x00/x90/x01/x00/x00'

格式符”i”表示转换为int,'ii'表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以看到输出的结果是乱码,因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的0×00000014, 0×00001009分别表示20和400。
struct.unpack

struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 下面是一个简单的例子:
 

str = struct.pack("ii", 20, 400)
a1, a2 = struct.unpack("ii", str)
print 'a1:', a1
print 'a2:', a2
 
#---- result:
#a1: 20
#a2: 400
struct.calcsize

struct.calcsize用于计算格式字符串所对应的结果的长度,如:struct.calcsize(‘ii'),返回8。因为两个int类型所占用的长度是8个字节。
struct.pack_into, struct.unpack_from

这两个函数在Python手册中有所介绍,但没有给出如何使用的例子。其实它们在实际应用中用的并不多。Google了很久,才找到一个例子,贴出来共享一下:
 

import struct
from ctypes import create_string_buffer
 
buf = create_string_buffer(12)
print repr(buf.raw)
 
struct.pack_into("iii", buf, 0, 1, 2, -1)
print repr(buf.raw)
 
print struct.unpack_from('iii', buf, 0)
 
#---- result
#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'
#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'
#(1, 2, -1)

关于格式字符串

在Python手册中,给出了C语言中常用类型与Python类型对应的格式符:

在Python的struct模块中进行数据格式转换的方法

具体内容请参考Python手册struct 模块

Python 相关文章推荐
Python 调用VC++的动态链接库(DLL)
Sep 06 Python
关于Python中空格字符串处理的技巧总结
Aug 10 Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
python是否适合网页编程详解
Oct 04 Python
python 动态调用函数实例解析
Oct 21 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 #Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 #Python
Python合并两个字典的常用方法与效率比较
Jun 17 #Python
Python操作串口的方法
Jun 17 #Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 #Python
Django中模型Model添加JSON类型字段的方法
Jun 17 #Python
Python中map和列表推导效率比较实例分析
Jun 17 #Python
You might like
留言板翻页的实现详解
2006/10/09 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP中的替代语法介绍
2015/01/09 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python中reader的next用法
2018/07/24 Python
python实现简单http服务器功能
2018/09/17 Python
基于python实现高速视频传输程序
2019/05/05 Python
python地震数据可视化详解
2019/06/18 Python
python 三元运算符使用解析
2019/09/16 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
冰淇淋店创业计划书范文
2013/12/27 职场文书
2014春晚主持词
2014/03/25 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
单位授权委托书范文
2014/08/02 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
公司财务管理制度
2015/08/04 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
医院病假条范文
2015/08/17 职场文书
教师个人教学反思
2016/02/23 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
搭建Yolov5服务器
2022/04/30 Servers