如何在 Mac 上打开并读取二进制文件
你手上有一个没有有用扩展名的文件,或者一个 macOS 不认识的文件,比如一个 .bin、一份固件转储、一个老游戏存档,或某个设备导出的东西。双击它,要么什么都没发生,要么它在 TextEdit 里打开成一整面乱码字符。你想知道如何在 Mac 上打开一个二进制文件,既不用瞎猜,也不用冒着损坏文件本身的风险。
为什么双击行不通
macOS 根据文件的扩展名来决定如何打开它,如果没有扩展名,就靠猜测它的类型。二进制文件,也就是存储原始数据而非文本的文件,没有系统能识别的标准扩展名,所以 macOS 要么拒绝打开它们,要么把它们交给它认为最接近的应用。通常那就是 TextEdit,它会试着把这些字节解码成文本,于是你看到的大多是无法辨认的符号,偶尔夹杂着几个真正的单词冒出来。
那种"噪声中夹着可读单词"的效果并不是你的错觉。二进制文件里常常内嵌文本(文件路径、标签、版本字符串),尽管周围的数据确实是二进制的。TextEdit 把这一切都当成文本渲染,这就是为什么你会看到那种半是乱码、半是熟悉的样子。它其实并没有给你展示任何有用的东西,而且如果你不小心从 TextEdit 存了盘,还可能损坏这个文件。
你真正想要的:十六进制视图
一个二进制文件不过是一串字节,每个字节都是 0 到 255 之间的一个数字。安全地查看它的标准方式是十六进制视图:每个字节显示为两个字符的十六进制值(00 到 FF),排成一行行,旁边有一个偏移列(告诉你在文件的哪个位置)和一个文本列(把同样的字节按 ASCII 解读,用于其中可读的部分)。这正是十六进制编辑器给你的东西,也是唯一一种不靠猜测格式就能向你展示真实内容的视图。
三种做法
用 Terminal,配合 xxd 或 hexdump。 macOS 两者都自带。运行 xxd yourfile.bin | less,你就能在 Terminal 里得到一份可滚动的十六进制转储。它很快,而且随时可用,但它是只读的,没有搜索、没有跳转到偏移,除了原始十六进制之外也不会对你所看的内容做任何解读。快速瞄一眼还行,做更多事就显得别扭了。
TextEdit 或其他文本编辑器。 别这么做。如上所述,它把字节解码成文本,而这对二进制数据来说是用错了视角,而且一旦被存盘,就有悄悄损坏文件的真实风险。
一款专用的十六进制编辑器。 如果你要做的不止是五秒钟的一瞥,这才是正确的工具:滚动浏览一个大文件、搜索特定的字节模式、跳转到已知偏移,或者查看一段字节实际代表什么(一个数字、一个日期、一种颜色、一段用不同编码存储的字符串)。Hexter 正是为此而生。它默认以只读方式打开每一个文件,所以查看一个陌生的二进制文件不会有改动它的风险。文件无论大小都会即时打开,因为 Hexter 按需读取字节,而不是把整个文件加载进内存。
分步操作
- 打开文件。 把它拖到 Hexter 上,或使用"文件 > 打开"。无需先猜测文件类型;Hexter 会把任何东西都当成原始字节打开。
- 读懂布局。 左侧的偏移列告诉你在文件中的位置。中间的十六进制网格把每个字节显示为两个十六进制字符。右侧的文本窗格把同样的字节显示为 ASCII,用于文件中确实是文本的那些部分。
- 跳转到特定偏移,如果你已经知道该看哪里,用 ⌘J 而不是滚动。
- 选中字节以检查它们。 选中一段范围会在检查器侧边栏中把这段数据按不同的数值类型解读给你看(8、16、32 或 64 位整数,有符号或无符号,两种字节序皆可)。这就是你判断四个字节究竟是文件大小、时间戳还是别的什么的方法。
- 搜索,如果你要找的是特定字符串或字节序列而非手动滚动,就用 ⌘F。
- 只有在你真的需要改动某个东西时才启用编辑。 Hexter 会让文件保持只读,直到你显式开启编辑,即便那时,改动也会停留在一个可撤销的补丁层中,直到你选择存储。你在只是查看时所做的任何操作都不会触及原文件。
如果结果发现这个文件是 Hexter 在结构上认识的格式,比如 PNG、ZIP、Mach-O、WAV 或 SQLite,分析标签页就会把真实的结构(分块边界、头部、字段)解析出来,陈列在原始字节旁边,让你得到的不只是十六进制。
这就是整个流程:打开、读懂三列、通过跳转或搜索到达你需要的位置,并在你需要知道某一段字节到底意味着什么时检查一个选区。不用猜,在你发话之前也没有任何风险。