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 相关文章推荐
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
使用python编写监听端
Apr 12 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
Python中的延迟绑定原理详解
Oct 11 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
python绘制玫瑰的实现代码
Mar 02 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
python性能测试工具locust的使用
Dec 28 Python
Python3中的tuple函数知识点讲解
Jan 03 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
JS库之ParticlesJS使用简介
2017/09/12 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
layUI实现列表查询功能
2019/07/27 Javascript
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
使用python实现名片管理系统
2020/06/18 Python
python os.rename实例用法详解
2020/12/06 Python
自荐信不宜过于夸大
2013/11/06 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
建设工地安全标语
2014/06/07 职场文书
2015年电工工作总结
2015/04/10 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
【2·13】一图读懂中国无线电发展
2022/02/18 无线电