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 相关文章推荐
基于Django模板中的数字自增(详解)
Sep 05 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
Python切片索引用法示例
May 15 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
django中瀑布流写法实例代码
Oct 14 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
python tornado使用流生成图片的例子
Nov 18 Python
next在python中返回迭代器的实例方法
Dec 15 Python
python 详解turtle画爱心代码
Feb 15 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+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
php析构函数的简单使用说明
2015/08/24 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
yii分页组件用法实例分析
2015/12/28 PHP
Smarty3配置及入门语法
2017/02/22 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
优秀大学生职业生涯规划书
2014/02/27 职场文书
健康家庭事迹材料
2014/05/02 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS