Python内建模块struct实例详解


Posted in Python onFebruary 02, 2018

本文研究的主要是Python内建模块struct的相关内容,具体如下。

Python中变量的类型只有列表、元祖、字典、集合等高级抽象类型,并没有像c中定义了位、字节、整型等底层初级类型。因为Python本来就是高级解释性语言,运行的时候都是经过翻译后再在底层运行。如何打通Python和其他语言之间的类型定义障碍,Python的内建模块struct完全解决了所有问题。

知识介绍:

在struct模块中最最常用的三个:

(1)struct.pack:用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。
(2)struct.unpack: 刚好与struct.pack相反,用于将字节流转换成python数据类型,该函数返回一个元组。
(3)struct.calcsize: 计算格式字符串所对应的结果的长度。

转换过程中遇到的格式操作:

格式符 C语言类型 Python类型
x pad byte no value
c char string of length 1
b signed char integer
B unsigned char integer
? _Bool bool
h short integer
H unsigned short integer
i int integer
I unsigned int integer or long
l long integer
L unsigned long long
q long long long
Q unsigned long long long
f float float
d double float
s char[] string
p char[] string
P void * long

实例详解:

#!/usr/bin/python
# -*- coding:utf-8 -*-
'''测试struct模块'''
from struct import *
import array

def fun_calcsize():
  print 'ci:',calcsize('ci')#计算格式占内存大小
  print '@ci:',calcsize('@ci')
  print '=ci:',calcsize('=ci')
  print '>ci:',calcsize('>ci')
  print '<ci:',calcsize('<ci')
  print 'ic:',calcsize('ic')#计算格式占内存大小
  print '@ic:',calcsize('@ic')
  print '=ic:',calcsize('=ic')
  print '>ic:',calcsize('>ic')
  print '<ic:',calcsize('<ic')

def fun_pack(Format,msg = [0x11223344,0x55667788]):
  result = pack(Format,*msg)
  print 'pack'.ljust(10),str(type(result)).ljust(20),
  for i in result:
    print hex(ord(i)), # ord把ASCII码表中的字符转换成对应的整形,hex将数值转化为十六进制
  print

  result = unpack(Format,result)
  print 'unpack'.ljust(10),str(type(result)).ljust(20),
  for i in result:
    print hex(i),
  print 

def fun_pack_into(Format,msg = [0x11223344,0x55667788]):
  r = array.array('c',' '*8)#大小为8的可变缓冲区,writable buffer
  result = pack_into(Format,r,0,*msg)
  print 'pack_into'.ljust(10),str(type(result)).ljust(20),
  for i in r.tostring():
    print hex(ord(i)),
  print

  result = unpack_from(Format,r,0)
  print 'pack_from'.ljust(10),str(type(result)).ljust(20),
  for i in result:
    print hex(i),
  print

def IsBig_Endian():
  '''判断本机为大/小端'''
  a = 0x12345678
  result = pack('i',a)#此时result就是一个string字符串,字符串按字节同a的二进制存储内容相同。
  if hex(ord(result[0])) == '0x78':
    print '本机为小端'
  else:
    print '本机为大端'

def test():
  a = '1234'
  for i in a:
    print '字符%s的二进制:'%i,hex(ord(i))#字符对应ascii码表中对应整数的十六进制

  '''
  不用unpack()返回的数据也是可以使用pack()函数的,只要解包的字符串符合解包格式即可,
  pack()会按照解包格式将字符串在内存中的二进制重新解释(说的感觉不太好...,见下例)
  '''
  print '大端:',hex(unpack('>i',a)[0])#因为pack返回的是元组,即使只有一个元素也是元组的形式
  print '小端:',hex(unpack('<i',a)[0])


if __name__ == "__main__":
  print '判断本机是否为大小端?',
  IsBig_Endian()

  fun_calcsize()

  print '大端:'
  Format = ">ii"
  fun_pack(Format)
  fun_pack_into(Format)

  print '小端:'
  Format = "<ii"
  fun_pack(Format)
  fun_pack_into(Format)

  print 'test'
  test()
  '''
  result:
  判断本机是否为大小端? 本机为小端
  ci: 8
  @ci: 8
  =ci: 5
  >ci: 5
  <ci: 5
  ic: 5
  @ic: 5
  =ic: 5
  >ic: 5
  <ic: 5
  大端:
  pack    <type 'str'>     0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
  unpack   <type 'tuple'>    0x11223344 0x55667788
  pack_into <type 'NoneType'>  0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
  pack_from <type 'tuple'>    0x11223344 0x55667788
  小端:
  pack    <type 'str'>     0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55
  unpack   <type 'tuple'>    0x11223344 0x55667788
  pack_into <type 'NoneType'>  0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55
  pack_from <type 'tuple'>    0x11223344 0x55667788
  test
  字符1的二进制: 0x31
  字符2的二进制: 0x32
  字符3的二进制: 0x33
  字符4的二进制: 0x34
  大端:0x31323334
  小端:0x34333231
  '''

本实例所用Python软件环境:win10+anaconda3+pycharm,Python版本:3.6

总结

以上就是本文关于Python内建模块struct实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python实现跨文件全局变量的方法
Jul 07 Python
跟老齐学Python之数据类型总结
Sep 24 Python
最基础的Python的socket编程入门教程
Apr 23 Python
python对象及面向对象技术详解
Jul 19 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
python 消费 kafka 数据教程
Dec 21 Python
Django中的模型类设计及展示示例详解
May 29 Python
获取python文件扩展名和文件名方法
Feb 02 #Python
Python字符串格式化%s%d%f详解
Feb 02 #Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 #Python
Python实现Pig Latin小游戏实例代码
Feb 02 #Python
python在线编译器的简单原理及简单实现代码
Feb 02 #Python
使用Python进行AES加密和解密的示例代码
Feb 02 #Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 #Python
You might like
PHP4实际应用经验篇(3)
2006/10/09 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
PHP实现变色验证码实例
2014/01/06 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
用python写asp详细讲解
2013/12/16 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
行政主管岗位职责
2013/11/18 职场文书
党员自我评价分享
2013/12/13 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
土地转让协议书范本
2014/04/15 职场文书
交通事故协议书
2014/04/15 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
基层党支部整改方案
2014/10/25 职场文书
2015学校年度工作总结
2015/05/11 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
JavaScript实现两个数组的交集
2022/03/25 Javascript
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python