二進位制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),這是為了在以文本模式傳輸檔案時,檢測換行符是否因轉換而被破壞。它不僅僅是單純的識別符號,還兼具傳輸過程中的損壞檢測功能,這一點讓人感受到二進位制格式設計的深邃之處。