练习 26:hexdump

译者:飞龙

自豪地采用谷歌翻译

你已经用xargs完成了热身,现在正在代码/审计的循环中。你现在将尝试以“测试优先”方式完成下一个挑战。这就是,你编写测试,它描述你的预期行为,然后实现该行为,直到通过测试。你将要复制hexdump工具,并尝试将你的版本的输出与真实版本匹配。这是“测试优先”开发真正有帮助的地方,因为它自动化了模仿另一个软件的流程。

当你需要编写一个糟糕的软件的替代品时,这种技术非常有用。软件中的一个常见工作是处理一个项目,它的目的是使用更新的实现替换旧系统。一个例子是用一个新的、热门的 Django 系统来替换旧的 COBOL 银行系统。动机通常是,通过使用比旧系统更容易使用的东西,来使其更容易维护和扩展。如果你可以编写一组自动测试来验证旧系统的行为,然后将该测试套件用于新系统,那么你可以通过一种方法,来确认你的替换品几乎正常。相信我,这些替代工作几乎是不可能的,通常不会成功,但自动测试是有帮助的。

这个练习中,你会向你的流程添加下面这些:

在你需要实现的场景中,编写一个测试用例,运行原始的hexdump。让我们假设-C选项。你将需要使用subprocess启动它,或者简单地提前运行它,并将结果保存到加载的文件。

通过测试你的hexdump版本,然后比较结果,编写使测试工作的代码。如果他们不等价,那么你就做错了。

然后审计测试代码和你的代码。

我选择了hexdump,因为难度在于,复制其奇怪的输出格式来查看二进制数据。它的工作方式不是特别复杂。它只是匹配你需要的正确输出。这有助于你练习“测试优先”的测试。

当我说“先写一个测试”时,我的意思并不是一个庞大的test.py文件,它具有所有的函数和大量的虚构代码。我的意思是我以前教过的东西。编写一个小型测试用例 - 也许只是一个测试函数的1/10,然后编写代码使其正常工作,然后在两者之间来回跳动。你越了解代码,你就可以写出越多的测试用例,但不要写一堆测试代码,并没有东西来运行它。而是要逐步编写。

挑战练习

当你想要查看不是可见文本的文件内容时,hexdump命令很有用。它以各种有用的格式显示文件中的字节,包括十六进制,八进制,并且后面带有 ASCII 输出。实现自己的hexdump的难度不是读取数据,甚至不是将其转换为不同的格式。你可以使用 Python 中的hex,oct,int和ord函数轻松地执行此操作。原始的格式化字符串运算符也很有用,因为它为固定精度的八进制和十六进制格式化提供了选项。

真正的困难在于为每个不同的选项正确格式化输出,以便它能够正确流动并适合屏幕。以下是Python .pyc文件的hexdump -C输出的前几行:

真正的困难在于为每个不同的选项正确格式化输出,以便它能够正确打印并适合屏幕。以下是Python .pyc文件的hexdump -C输出的前几行:

00000000 03 f3 0d 0a f0 b5 69 57 63 00 00 00 00 00 00 00 |......iWc.......|

00000010 00 03 00 00 00 40 00 00 00 73 3a 00 00 00 64 00 |.....@...s:...d.|

00000020 00 64 01 00 6c 00 00 6d 01 00 5a 01 00 01 64 00 |.d..l..m..Z...d.|

00000030 00 64 02 00 6c 02 00 6d 03 00 5a 03 00 01 64 03 |.d..l..m..Z...d.|

00000040 00 65 01 00 66 01 00 64 04 00 84 00 00 83 00 00 |.e..f..d........|

这个“规范”格式化的手册页说:

以十六进制显示输入偏移量。所以 10 不是十进制中的 10,它是十六进制。你知道十六进制吗?

十六个空格分隔的,两列十六进制字节。这是转换为十六进制的每个字节。多少列代表一个字节?

然后以%_p格式显示相同的十六个字节,看起来像 Python 格式化占位符,但它专用于hexdump。你需要手册页,来了解其含义。

之后hexdump也可以从stdin输入接收输入,这意味着你可以将东西使用管道连接到它:

echo "Hello There" | hexdump -C

这会在我的 macOS 上产生如下输出:

00000000 48 65 6c 6c 6f 20 54 68 65 72 65 0a |Hello There.|

0000000c

请注意,最后一行有一个字符c?猜猜看这是什么。

这就是格式化和输出,它比较困难,你的任务是尽可能复制它,这就是为什么这个练习的开头让你以“测试优先”的方式工作。创建测试,将你的数据扔给hexdump将会更容易,并将其与真正的hexdump进行比较,直到它开始工作。

研究性学习

研究od命令,看看你的hexdump代码是否可以复用于od的实现。如果可以的话,可以制作一个他们都使用的库。

深入学习

有人主张只做“测试优先”的开发,但我相信没有永远适用的技术。当我从用户的角度测试软件的交互时,我更喜欢写测试。我将编写测试,它描述了用户与软件的交互,然后实现软件。这是你所做的事情,因为你正在测试,用户如何从你的hexdump命令行调用中看到输出。

对于其他类型的编程任务,决定首先写测试还是编写代码是荒谬的,只会扼杀你解决问题的能力。自动化测试是简单的工具,你是一个聪明的人,有权力尝试使用工具,但你认为他们将在每种情况下都能最好地工作。任何告诉你区别的人可能是一个无理取闹的人,实际上并不擅长编程。

python hexdump_练习 26:`hexdump`相关推荐

  1. python hexdump_笨办法学 Python · 续 练习 26:`hexdump`

    练习 26:hexdump 译者:飞龙 自豪地采用谷歌翻译 你已经用xargs完成了热身,现在正在代码/审计的循环中.你现在将尝试以"测试优先"方式完成下一个挑战.这就是,你编写测 ...

  2. python学习笔记26(python中__name__的使用)

    python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...

  3. Python练习 4.26 ~ 5.6

    Python练习 4.26 ~ 5.6 第6章-8 输出全排列 输入整数n(3<=n<=7),编写程序输出1,2,-,n整数的全排列,按字典序输出. 输入格式: 一行输入正整数n. 输出格 ...

  4. python hexdump_细说Linux中怎么用hexdump命令

    摘要: hexdump 描述: hexdump命令一般用来查看"二进制"文件的十六进制编码,从手册上查看,其查看的内容还要很多,诸如:ascii, decimal, hexadec ...

  5. python如何生成26个英文字母(包括大小和小写)以及附上英文可见(常用)字符的ASCII码表。

    目的:我们想要利用python生成26个英文字母,然后将其存入列表. 方案: 使用chr函数,将一个整数解释成一个字符,这个整数其实就是这个字符的ASCII码.比如字母a对应的ASCII码就是97,那 ...

  6. 笨办法学python加分习题26

    python版本:3      若有错误,敬请指出 模块名称:测试.py 我的是版本3,表示很坑爹,需要宝宝把所有的print加上括号 =0= >_< #加分习题26 import 加分习 ...

  7. 学python好不好-26岁了,自学Python怎么样?

    数学与应用数学专业转行Python的话还是很有优势的.首先来了解一下Python的可就业方向有那些,找到方向后.了解重点学习的知识点,是比较有效率的学习方式. 一.Python就业方向 /> 来 ...

  8. 数据结构之图:有向图的拓扑排序,Python代码实现——26

    有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个 ...

  9. 小白学 Python 爬虫(26):为啥上海二手房你都买不起

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

最新文章

  1. 高逼格的 SQL 写法:行行比较
  2. 智能循迹避障小车C语言程序编写思路,设计一个循迹避障一体的智能小车的资料和代码及电路图详细概述...
  3. 系统分析师零散知识点
  4. 阿里Sentinel控制台源码修改-对接Apollo规则持久化
  5. .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...
  6. Zabbix安装图解教程
  7. Web前端是什么?大牛推荐的高效学习路线,减少2倍时间
  8. go 自定义error怎么判断是否相等_「GCTT 出品」Go 系列教程——30. 错误处理
  9. c语言ascii码表_零基础学C语言——变量、常量与数据类型
  10. JavaSE(9)-细节狂魔:OOP之继承多态?20K字长篇看完,有手就行
  11. PNP问题学习笔记1
  12. 爱普生打印机无法正常工作的解决方法
  13. php writeup,PHP_encrypt_1(ISCCCTF) Writeup
  14. Provides transitive vulnerable dependency - Intellij IDEA
  15. 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换
  16. 8. 监督学习的统计理论
  17. Docker-Dockerfile学习
  18. 科普:互联网的盈利模式
  19. 【汇正财经】什么是复盘?
  20. 华为笔记本linux驱动支持,华为笔记本电脑对Linux 5.5内核的支持得到改善

热门文章

  1. [C++程序设计](入门级题解) 校门外的树
  2. 数据结构c语言java语言差别,C语言和JAVA有什么区别?
  3. linux 查看用户的uid和gid
  4. 74 - 键盘驱动程序的完善
  5. matlab kappa计算,MSA系列9:在使用交叉表法计算Kappa时,期望值是怎么计算出来的?...
  6. 2.VM虚拟机网络设置---NAT模式
  7. 使用ul li和不适用ul li的区别
  8. Typora添加数学公式
  9. 全球及中国小丑鱼行业研究及十四五规划分析报告
  10. python urlopen 超时_在Python的urllib2 urlopen中检测超时错误