在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 相关文章推荐
35个Python编程小技巧
Apr 01 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Python如何实现线程间通信
Jul 30 Python
Django admin组件的使用
Oct 24 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
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
谈谈JS中的!!
2017/12/07 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
Python实现随机选择元素功能
2017/09/14 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
主持词开场白
2014/03/17 职场文书
合作协议书
2014/04/23 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
诉讼授权委托书
2014/10/15 职场文书
教师群众路线心得体会
2014/11/04 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL