和硬盘打交道,不免会用到字节、大\小端对齐、结构等。C语言定义了很多类型,我们定义一个结构,配合mem***函数、大小端转换宏等几乎可以应付了。Python就没那么好用了,因为它本身也不是为这种低级操作而设计的。处理这种二进制数据,貌似只有struct库能沾上一点边,它用起来像printf,数据一多就会把你搞晕的,它还有几个致命缺点:1. 不支持小于1个字节的;2. 数据格式固定。总的来说,它的扩展性和易用性是很差的。

Construct一改模仿C语言struct的“趋势”,结构体不再是对数据的定义而是描述。这一颠覆性的思想可以说把数据流unpack推向到一个新台阶。我们不再受限于语言本身所定义的类型,而是像正则表达式那样根据数据格式来描述结构。

这种思想也不是Construct首先提出的,一些网络数据包处理程序很早也在使用(Construct最早也是用于处理TCP/IP数据包的)。我们可以看看该库所带的一个处理mbr解析的示例

from construct import *

mbr = Struct("mbr",

HexDumpAdapter(Bytes("bootloader_code", 446)),

Array(4,

Struct("partitions",

Enum(Byte("state"),

INACTIVE = 0x00,

ACTIVE = 0x80,

),

BitStruct("beginning",

Octet("head"),

Bits("sect", 6),

Bits("cyl", 10),

),

Enum(UBInt8("type"),

Nothing = 0x00,

FAT12 = 0x01,

XENIX_ROOT = 0x02,

XENIX_USR = 0x03,

FAT16_old = 0x04,

Extended_DOS = 0x05,

FAT16 = 0x06,

FAT32 = 0x0b,

FAT32_LBA = 0x0c,

NTFS = 0x07,

LINUX_SWAP = 0x82,

LINUX_NATIVE = 0x83,

_default_ = Pass,

),

BitStruct("ending",

Octet("head"),

Bits("sect", 6),

Bits("cyl", 10),

),

UBInt32("sector_offset"), # offset from MBR in sectors

UBInt32("size"), # in sectors

)

),

Const(Bytes("signature", 2), "\x55\xAA"),

)

if __name__ == "__main__":

cap1 = (

"33C08ED0BC007CFB5007501FFCBE1B7CBF1B065057B9E501F3A4CBBDBE07B104386E00"

"7C09751383C510E2F4CD188BF583C610497419382C74F6A0B507B4078BF0AC3C0074FC"

"BB0700B40ECD10EBF2884E10E84600732AFE4610807E040B740B807E040C7405A0B607"

"75D2804602068346080683560A00E821007305A0B607EBBC813EFE7D55AA740B807E10"

"0074C8A0B707EBA98BFC1E578BF5CBBF05008A5600B408CD1372238AC1243F988ADE8A"

"FC43F7E38BD186D6B106D2EE42F7E239560A77237205394608731CB80102BB007C8B4E"

"028B5600CD1373514F744E32E48A5600CD13EBE48A560060BBAA55B441CD13723681FB"

"55AA7530F6C101742B61606A006A00FF760AFF76086A0068007C6A016A10B4428BF4CD"

"136161730E4F740B32E48A5600CD13EBD661F9C3496E76616C69642070617274697469"

"6F6E207461626C65004572726F72206C6F6164696E67206F7065726174696E67207379"

"7374656D004D697373696E67206F7065726174696E672073797374656D000000000000"

"0000000000000000000000000000000000000000000000000000000000000000000000"

"00000000000000000000000000000000002C4463B7BDB7BD00008001010007FEFFFF3F"

"000000371671020000C1FF0FFEFFFF761671028A8FDF06000000000000000000000000"

"000000000000000000000000000000000000000055AA"

).decode("hex")

print mbr.parse(cap1)

Construct由众多Adapter构成,你可以为某种特定的数据流形式定义一种。上例中的Enum, BitStruct也算一种。相信在你看完这个例子后应该知道什么是“结构描述”了。

Construct可以从pypi上下载到。它有很完善的文档,初学者建议从这里开始http://construct.wikispaces.com/tutorial

python实现数据恢复_数据恢复/电子取证 非常有用的python库——Construct | 学步园...相关推荐

  1. python 字符串拼接_面试官让用 3 种 python 方法实现字符串拼接 ?对不起我有8种……...

    点击上方 蓝字关注我们 点击上方"印象python",选择"星标"公众号重磅干货,第一时间送达!之前发过很多关于 Python 学习的文章,收到大家不少的好评, ...

  2. python控制灯泡_人工智能应用-手把手教你用Python硬件编程实现打开或关闭电灯泡...

    之前我们已经给广大爱好者或程序员朋友们,带来了硬件版的或者说物联网版本的Hello World C++Builder版.Delphi.Visual Basic.Net等的程序源码和教学资料,让大家对硬 ...

  3. python ide 最好_我在iPad上最好的Python IDE

    python ide 最好 Having finished my first year at university, and being left with very little to do thi ...

  4. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  5. python语言 行业_如何入门编程开发行业 选择Python语言怎么样

    如何入门编程开发行业?选择Python语言怎么样?Python是一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件,语法简洁清晰,它具有丰富和强大的库.它常被称为胶水语言,能够把用其他语言制作 ...

  6. python笔记视频_终于拿到!清华大佬Python视频+书+笔记汇总

    终于拿到!清华大佬Python视频+书+笔记汇总 清华学姐推荐的Python视频400集,拿走不谢!

  7. python封装c++_用pybind11封装C++实现的函数库

    现有若干用C++编写的函数,为了能够用Python调用它们,可以通过pybind11将它们封装到一个Python模块中,在编写Python程序时只要导入该模块便能使用这些函数. 一.实现步骤 用C++ ...

  8. python 建筑计算_制图小技巧:巧用Python和ELK瞬间完成总图建筑名称标注

    哎呦,又到了每周一次的制图教室啦.经过前面两次制图教程的分享,相信大家对于白模填色和写实渲染这两种表达方式肯定有了较好的掌握. 那么今天我们就转战制图技巧篇,和童鞋们聊一下总平面图中的建筑名称标注问题 ...

  9. python编程首选_为什么说学编程首选是python

    为什么学编程 你可能不会成为一名专业的程序员, 不过学编程的确是有很多的原因的 1. 最重要的是你想学!不论是因为业余爱好还是作为职业,编程都是十分有意思的, 都会让你收获很多 2. 如果你是对计算机 ...

最新文章

  1. python math库常用函数_Python math库常用函数
  2. 系统延时任务和定时任务
  3. mysql版本选择最终建议
  4. 雅虎失败原因:没有跟上互联网变化节奏
  5. 第一名数据科学工作冠状病毒医生
  6. CCNP-第一篇-思科SLA+华为BFD+ODR+浮动路由
  7. StringBuffer/StringBuilder/String的区别
  8. (34)Gulp 构建HTML页面文件
  9. 火狐浏览器百度网盘服务器响应,火狐浏览器打不开百度网盘怎么解决?解决百度网盘打不开的步骤分享...
  10. .net中Task.WaitAll和WaitAny同步的等待Task完成
  11. 数据科学包1---numpy
  12. 复制含有随机指针节点的链表
  13. shell 查某个字符串_Shell脚本编程04——Shell编程之sed与awk
  14. ZEGO 自研客户端配置管理系统 —— 云控
  15. 准备建个深圳程序员内推找工作微信群
  16. java基础企业级入门视频教程-周江超-专题视频课程
  17. 华为手机显示服务器异常怎么办,手机一直提示云服务器异常怎么办
  18. Openstack Kilo安装错误汇总
  19. 计算机专业发展基金申报书,【计算机学院】国家自然科学基金申请书写作技巧及评审要点...
  20. python——今天是第几天

热门文章

  1. registry :分支操作值Archive有什么用?
  2. 【Spark】SparkStreaming之windows操作
  3. 【Flink】Flink启动报错 BindException: Could not start rest endpoint on any port in port range 7089
  4. 编辑服务器上的文件,Sublime Text编辑远程Linux服务器上的文件
  5. kafka不使用自带zk_kafka概念扫盲
  6. Sharding-Jdbc实现读写分离、分库分表,妙!
  7. 一般单元测试不可以并行进行_铝型材配件可以不可以进行二次加工
  8. linux .net core 后台执行,.NET Core基于Generic Host实现后台任务方法教程
  9. Springboot自动配置原理入门
  10. redis学习-主从复制Master/slave