Python struct模块解析


Posted in Python onJune 12, 2014

python提供了一个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)    #转换成字节流,虽然还是字符串,但是可以在网络上传输
>>> print len(str)               #ii 表示两个int
8                                #可以看到长度为8个字节,正好是两个int型数据的长度
>>> print str
                               #二进制是乱码
>>> print repr(str)
'\x14\x00\x00\x00\x90\x01\x00\x00'   #其中十六进制的 0x00000014, 0x00001009分别表示20和400
>>>

   由此我们就可以任意的进行组包了,比如下面一个打包的例子,只介绍其中的pack

format = "!HH%ds" % len(data)
buffer = struct.pack(format,opcode,blocknumber,data)

 我们要对一个数据进行打包,加上一些个包头,我们根据下面的格式符信息,知道H是unsigned short是2个字节,而s是char型。所以这个buffer就是2个字节的opcode,2个字节的blocknumber,和len长的char。

Python struct模块解析

struct.unpack():

   我们接着上面的例子运行:

>>> a1,a2=struct.unpack('ii',str)
>>> print 'a1',a1
a1 20
>>> print 'a2=',a2
a2= 400

可以看到 “ii”以四个字节为分界,把8个字节的str分成了两个int型的整数。

 struct.calcsize():用来计算特定格式的输出的大小,是几个字节,比如:

>>> struct.calcsize('HH4s')
8
>>> struct.calcsize('ii')
8
>>>
>>> format='!HH%ds' % len('hello python')
>>> struct.calcsize(format)
16
>>>
Python 相关文章推荐
python判断给定的字符串是否是有效日期的方法
May 13 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
pytorch使用Variable实现线性回归
May 21 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python values()与itervalues()的用法详解
Nov 27 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 Python
深度剖析使用python抓取网页正文的源码
Jun 11 #Python
python k-近邻算法实例分享
Jun 11 #Python
浅析python 内置字符串处理函数的使用方法
Jun 11 #Python
python使用正则表达式检测密码强度源码分享
Jun 11 #Python
Python查看多台服务器进程的脚本分享
Jun 11 #Python
Python SQLite3数据库操作类分享
Jun 10 #Python
Python不规范的日期字符串处理类
Jun 10 #Python
You might like
php && 逻辑与运算符使用说明
2010/03/04 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
Vue ​v-model相关知识总结
2021/01/28 Vue.js
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python制作小说爬虫实录
2017/08/14 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python  Django 母版和继承解析
2019/08/09 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
Order by的几种用法
2013/06/16 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
华三通信H3C面试题
2015/05/15 面试题
Ruby如何进行文件操作
2014/07/17 面试题
室内设计专业个人的自我评价
2013/10/19 职场文书
艺术应用与设计个人的自我评价
2013/11/23 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
医学求职信
2014/05/28 职场文书
校园运动会广播稿
2014/10/06 职场文书
2014年党总支工作总结
2014/12/18 职场文书
小学运动会前导词
2015/07/20 职场文书
python - timeit 时间模块
2021/04/06 Python
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android