二进制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" |
| 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编辑器的小技巧
- 想识破被篡改扩展名的文件真实身份时,可将文件开头的若干字节(魔数)与上方一览表对照。扩展名只是自我声明,而魔数源自文件格式本身,更难以伪装。
- 在直接输入十六进制模式下,可以直接粘贴从其他工具复制的字节序列(无论是空格分隔还是换行分隔)并读取。
- 编辑过程中如果误点了单元格,可按Esc键取消该单元格的编辑,字节不会被改动。
- 在调试二进制协议时,将预期的字节序列与实际收发的字节序列在本工具中并排比较,能更容易定位不一致之处。
常见问题
可以。读取文件后,将其开头字节与上方"常见文件签名"一览表对照即可。例如某文件扩展名为`.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),这是为了在以文本模式传输文件时,检测换行符是否因转换而被破坏。它不仅仅是单纯的标识符,还兼具传输过程中的损坏检测功能,这一点让人感受到二进制格式设计的深邃之处。