笨办法学 Python · 续 练习 26:`hexdump`

练习 26:hexdump

原文:Exercise 26: hexdump

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

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

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

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

  • 在你需要实现的场景中,编写一个测试用例,运行原始的hexdump。让我们假设-C选项。你将需要使用subprocess启动它,或者简单地提前运行它,并将结果保存到加载的文件。
  • 通过测试你的hexdump版本,然后比较结果,编写使测试工作的代码。如果他们不等价,那么你就做错了。
  • 然后审计测试代码和你的代码。

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

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

挑战练习

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

真正的困难在于为每个不同的选项正确格式化输出,以便它能够正确流动并适合屏幕。以下是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命令行调用中看到输出。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 《白夜行》,我看过最绝望,悲伤的故事。男、女主角一出场就注定了这是一个悲剧,一个无法挽回也无法得到救赎的悲剧...
    享受生活的喵阅读 185评论 0 1
  • 人是念旧的动物,到了中年,越发靠后,这种特征体现的越发明显。前半生风华正茂,意气风生,执着追求个人上的成功,不怕失...
    黎意阅读 285评论 0 3
  • 《摔跤吧!爸爸》如果用一句话来总结那就是:牛逼的爸爸造就了女儿彪悍的人生,这不需要解释!看完这部剧之后,真心觉得不...
    淑女必书阅读 634评论 0 0