二进制Hex编辑器|以十六进制查看和编辑文件

拖放文件即可以逐字节的十六进制形式(hex dump)查看其内容。可通过文件头的魔数(magic bytes)确认文件的真实类型,直接编辑字节并下载。文件不会上传到服务器。

常见文件签名(魔数)一览

格式 起始字节(十六进制) 偏移量 备注
PNG 89 50 4E 47 0D 0A 1A 0A 0 图像文件。若8个字节全部一致,几乎可以确定为PNG
JPEG FF D8 FF 0 图像文件。第4字节因JFIF/Exif等变体而不同
GIF 47 49 46 38 39 61 / 47 49 46 38 37 61 0 对应ASCII字符串"GIF89a"或"GIF87a"
PDF 25 50 44 46 2D 0 对应ASCII字符串"%PDF-",其后紧跟版本号
ZIP / docx / xlsx / jar 50 4B 03 04 0 ZIP格式。Office Open XML及多种压缩、归档格式内部均基于ZIP
Windows可执行文件(EXE/DLL) 4D 5A 0 对应ASCII字符串"MZ",是PE格式中遗留的MS-DOS可执行文件头标识
ELF可执行文件 7F 45 4C 46 0 Linux等系统使用的可执行文件、共享库格式

什么是二进制Hex编辑器

任何文件归根结底都是一串字节。Hex编辑器将这些内容逐字节以十六进制形式显示出来,并允许在需要时直接改写。很多格式的开头几个字节都藏着表明真实格式的"魔数",因此不必轻信扩展名,也能判断文件的真实类型。

本工具支持拖放文件或直接输入十六进制来读取内容,查看、编辑、下载全部在浏览器内完成,内容不会发送到服务器。不过对于较大的文件,仅会处理前64KB,超出部分即使下载也不会被保留。

Hex编辑器的使用方法

  1. 读取文件 拖放文件,或直接粘贴十六进制字符串即可读取,空格与换行会被自动忽略。
  2. 查看起始字节 对照偏移量0附近的内容与上方一览表,即可判断文件的真实格式。
  3. 编辑字节 点击任意十六进制单元格,可将该字节改写为00~FF之间的数值,ASCII列会同步更新。
  4. 下载编辑结果 将修改后的内容保存为文件。原始文件不会被改动,因此可以放心尝试各种实验性修改。

用好本工具的小技巧

  • 想识破被篡改扩展名的文件真实身份时,可将文件开头的若干字节(魔数)与上方一览表对照。扩展名只是自我声明,而魔数源自文件格式本身,更难以伪装。
  • 在直接输入十六进制模式下,可以直接粘贴从其他工具复制的字节序列(无论是空格分隔还是换行分隔)并读取。
  • 编辑过程中如果误点了单元格,可按Esc键取消该单元格的编辑,字节不会被改动。
  • 在调试二进制协议时,将预期的字节序列与实际收发的字节序列在本工具中并排比较,能更容易定位不一致之处。

Hex编辑器的应用场景

识破伪装扩展名的文件

查看起始字节即可确认扩展名与实际格式是否一致,适用于检查可疑附件。

排查文件损坏的原因

通过字节序列可判断文件头是否缺失,或数据是否在中途被截断,有助于评估修复的可能性。

学习文件格式规范

对照规范文档与实际字节序列阅读,能更具体地理解文件头的结构。

制作用于测试的损坏数据

故意改写部分字节,可用来验证程序在遇到异常文件时的行为表现。

二进制相关术语

字节
以8位为一组的单位,在十六进制中用00到FF两位数表示。
魔数
位于文件开头、用于标识格式的固定字节序列,也称为文件签名。
偏移量
从文件开头起算的字节位置,通常以十六进制表示。
文件头
位于文件开头、汇总格式与大小等信息的部分。
ASCII显示
将每个字节解释为字符的显示方式,有助于发现嵌入的文本内容。
字节序
多字节数值的排列顺序,不同格式中高位字节可能在前或在后。

常见问题

可以。读取文件后,将其开头字节与上方"常见文件签名"一览表对照即可。例如某文件扩展名为`.txt`,但开头却是FF D8 FF,那么它很可能实际上是一个JPEG图像。

若一次性将数百MB乃至数GB的整个文件以十六进制形式渲染,会因产生海量DOM元素而导致浏览器卡顿甚至无响应。将显示范围限制在前64KB,可以在安全流畅的前提下满足查看文件头信息等主要使用场景。

如果显示内容被截断为前64KB,则下载的文件也仅包含这64KB(之后的数据不会被保留)。对于64KB以下的文件,除您编辑的字节外,其余部分会与原文件完全一致地下载。

不会。文件的读取、显示、编辑、下载均完全在浏览器内的JavaScript中完成,文件内容不会被发送到任何外部服务器。
工具君

闲话 ― 为何文件的真实身份取决于字节而非扩展名

Windows的文件扩展名,本质上只是告诉操作系统"该用哪个应用程序打开此文件"的提示信息,与文件的实际内容相互独立。因此把`.txt`改名为`.jpg`并不会让它变成图像,反之删除真正图像文件的扩展名,数据本身仍然是图像。正因为扩展名只是"自我声明",将可执行文件伪装成图片或文档的恶意软件手法由来已久。

为应对这一点,多数文件格式在开头几个字节中嵌入了固定的标识符(魔数,magic bytes)。例如PNG规定开头必须是`89 50 4E 47 0D 0A 1A 0A`这8个字节,因此操作系统或应用程序只有在实际读取文件内容后,才能真正确认"这是否确实是PNG"。类Unix系统的`file`命令以及浏览器的MIME类型判定,主要依据也是这种魔数比对,而非扩展名。

魔数的设计中也蕴含着历史性的巧思。例如PNG的8个字节中特意包含了换行符(0D 0A),这是为了在以文本模式传输文件时,检测换行符是否因转换而被破坏。它不仅仅是单纯的标识符,还兼具传输过程中的损坏检测功能,这一点让人感受到二进制格式设计的深邃之处。