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中with语句的用法
Apr 15 Python
python实现数独算法实例
Jun 09 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
解决seaborn在pycharm中绘图不出图的问题
May 24 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
python dict乱码如何解决
Jun 07 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
Python打包为exe详细教程
May 18 Python
python中的random模块和相关函数详解
Apr 22 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
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python3.5的包存放的具体路径
2020/08/16 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
SQL Server数据库笔试题和答案
2016/02/04 面试题
店长岗位职责
2013/11/21 职场文书
公司应聘求职信
2014/06/21 职场文书
英语复习计划
2015/01/19 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
老兵退伍感言
2015/08/03 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript