什么是十六进制编辑器(以及你什么时候真的需要它)
有人叫你"用十六进制编辑器看看它",或者你搜了一下十六进制查看器就落到了这里,却还不太确定它到底是什么。没关系。十六进制编辑器是一个程序,它把一个文件的原始内容逐字节地展示给你,而不是试图把它解读成一份文档、一张图像或一张表格。它是你能做到的、最接近看到磁盘上究竟存了什么的方式。
为什么偏偏是十六进制
一个文件,任何文件,都不过是一串字节,而每个字节都是 0 到 255 之间的一个数字。你可以用十进制来显示这些数字,但 0 到 255 最多占三位,而且没法整齐地对齐。你也可以用二进制来显示它们,但单个字节就是八位的 1 和 0,很难用眼睛去扫。十六进制(16 进制,使用数字 0-9 和字母 A-F)是折中方案:每个字节恰好占两个字符,从 00 到 FF,这样一行字节就能对齐成一个整齐、便于扫视的网格。这就是"十六进制"成为标准、而非十进制或二进制的全部原因。这是一个为了可读性的选择,不是技术上的硬性要求。
你实际在看的是什么
在十六进制编辑器里打开任何文件,你会看到并排的三样东西,对应的都是同一份数据:
- 偏移:你在文件中走了多远,通常本身也用十六进制显示,方便你稍后跳回某个特定位置。
- 十六进制字节:真正的数据,每字节两个字符,分组成行(常见为每行 16 字节)。
- 文本(ASCII)视图:同样的字节被重新解读为字符,用于文件中恰好是可读文本的那一部分。非文本字节通常显示为一个点作为占位符。
第三列就是为什么在大多是二进制数据的文件里,文件路径、标签和版本字符串也常常可见:任何内嵌的文本都会在那一列显示出来,尽管整个文件并不是一个文本文件。
你什么时候真的会需要它
大多数人一辈子都不会打开十六进制编辑器,这完全正常。它确实是正确工具的那些情形都很具体:
- 一个文件的扩展名与它的实际内容不符。 有人把一个
.zip改名成了.doc,或者你不确定一个.db文件是否真的是数据库。大多数格式的头几个字节是一个独特的签名(PNG 以89 50 4E 47开头,ZIP 以50 4B开头),十六进制视图几秒钟就能确认它。 - 一个文件损坏了,而你想知道是怎么坏的。 下载被截断、传输出错、一个被覆盖的头部。看到原始字节能告诉你损坏是在开头、结尾,还是零散分布。
- 你正在调试某个读写二进制数据的东西,比如一种存档格式、一个配置文件、一个网络协议,而你需要确认究竟产生了哪些字节。
- 你想验证某个特定的值,比如确认四个字节是否真的代表你预期的文件大小,或者检查一个时间戳,而不必信任一个黑盒工具去正确地解读它。
- 好奇心。 有不少人只是为了看看某种熟悉的文件格式底下究竟长什么样,就打开过一次十六进制编辑器。那是一个完全正当的理由。
如果上面这些都不符合你正在做的事,那你多半不需要它,这也没关系。它是一款面向特定问题的专门工具。
什么样的十六进制编辑器算得上好,而不只是能用
一旦你确实需要它,这些工具做的基本上都是同一件基础活儿:显示字节、让你滚动、让你搜索。真正重要的差别在于安全和清晰,而不是原始功能的多少。Hex Fiend 是大多数 Mac 用户默认最终会用上的那款免费开源选择,它确实很能干,尤其是在处理超大文件时。Hexter 采取了一种更窄、更谨慎的路子:每个文件都以只读方式打开,所以查看陌生的东西不带任何风险;编辑是一个显式、可撤销的步骤,而非默认状态;常见文件格式(PNG、ZIP、Mach-O、WAV、SQLite)的结构会被自动解析出来,而不是把你晾在一边靠手去解码头部。
你想要哪一款,取决于你在做什么。如果你要逐字节比较两个数 GB 的文件,Hex Fiend 的比对就是为那种规模打造的。如果你只是需要确认一个文件到底是什么、检查区区几个字节,或者做一处小而谨慎的编辑而不必担心意外毁掉原文件,那正是 Hexter 所打造的场景。