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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
python简单猜数游戏实例
Jul 09 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
Python配置mysql的教程(推荐)
Oct 13 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
Python callable()函数用法实例分析
Mar 17 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python turtle库画一个方格和圆实例
Jun 27 Python
基于Python的Jenkins的二次开发操作
May 12 Python
python能做哪些生活有趣的事情
Sep 09 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 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
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
python中黄金分割法实现方法
2015/05/06 Python
Python简明入门教程
2015/08/04 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
python实现的生成word文档功能示例
2019/08/23 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
如何进行Linux分区优化
2016/09/13 面试题
库房管理员岗位职责
2014/03/09 职场文书
保护环境建议书
2014/03/12 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
大学生创业计划书
2014/08/14 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
档案接收函格式
2015/01/30 职场文书
新学期家长寄语2016
2015/12/03 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏