二進制、十六進制和資料單位解釋
程式設計、網路和鑑識工作中使用的二進制、十六進制和資料單位慣例的實用詞彙表。
每一個你在十六進制編輯器中檢查的位元組、每一個你計算的子網路遮罩、每一個工具報告的檔案大小,都取決於一小組數字系統和單位慣例。搞錯這些,你會誤判緩衝區大小、誤讀記憶體傾印,或與同事爭論 1 KB 到底是 1000 還是 1024 位元組。
二進制:電腦真正使用的基數
二進制是基數 2 — 只有 0 和 1。單個二進制數字是一個位元。將 8 個位元組合在一起,你會得到一個位元組,它可以表示 256 個不同的值(0 到 255 無號,或 -128 到 127 有號二補數)。
當你看到 01001000 時,那是十進制的 72,恰好是 'H' 的 ASCII 代碼。手工轉換只是將從最右邊位元開始的 2 的冪次相加:2^6 + 2^3 = 64 + 8 = 72。像 python3 -c "print(bin(72))" 或對檔案使用 xxd 這樣的工具會立即完成這個任務,但當你在對位元遮罩進行反向工程或計算 TCP 標頭中的標誌值時,理解數學很重要。
十六進制:二進制的速記法
十六進制是基數 16,使用 0-9 和 A-F。它存在的原因是二進制在大規模使用時難以閱讀,十進制也不能乾淨地映射到位元組邊界。一個十六進制數字代表正好 4 個位元,所以兩個十六進制數字代表一個完整的位元組 — 0x00 到 0xFF 涵蓋所有 256 個位元組值,沒有浪費空間。
這就是為什麼十六進制傾印是 xxd、hexdump -C 或反組譯器的記憶體檢視中的預設格式。當你在檔案的開頭看到 0x4D 0x5A 時,那就是識別 Windows PE 可執行檔的 MZ 標頭。記憶體位址、顏色代碼(#FF5733)、MAC 位址和 IPv6 位址都習慣上用十六進制寫,因為它與底層位元組和半位元組結構映射得非常乾淨。
十六進制轉十進制:0x4D = (4 × 16) + 13 = 77。在 Python 中,int('4D', 16) 可以讓你不用手工計算就得到結果,而 hex(77) 可以反向轉換。
二進制、十進制和十六進制在實踐中的實際交集
IP 位址是三者碰撞的好例子。像 192.168.1.1 這樣的 IPv4 位址實際上是四個位元組:二進制是 11000000.10101000.00000001.00000001,十六進制是 C0.A8.01.01。子網路劃分數學 — 判斷兩個位址是否在同一網路上 — 從根本上說是對子網路遮罩的二進制 AND 運算,雖然我們為了方便起見用點分十進制寫所有東西。
在數位鑑識和惡意軟體分析中,你不斷在這些表示法之間轉換。反組譯器以十六進制顯示操作碼,但 CPU 執行原始二進制,而暫存器值根據內容通常被解釋為十進制偏移或 ASCII 字串。知道 0x41 既是數字 65 也是 ASCII 字元 'A' 是加快手工分析速度的那種模式識別。
資料單位:1000 vs 1024 問題
這是人們真正吃虧的地方。儲存設備製造商、檔案系統和作業系統並不總是同意什麼是
本文由 AI 協助撰寫,經 Michal Pilch(CISSP)審核並發佈,Korra Studio。
這是 Korra Studio 知識庫中的一篇筆記——該平台將每個主題與一對一的師資配對。
免費開始arrow_forward