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操作CouchDB的方法
Oct 08 Python
python删除过期文件的方法
May 29 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 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
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php实现Session存储到Redis
2015/11/11 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
详解php中的implements 使用
2017/06/13 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python代码注释规范代码实例解析
2020/08/14 Python
python re模块常见用法例举
2021/03/01 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
物业公司采购员岗位职责
2013/12/31 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
导游个人求职信范文
2014/03/23 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL