1. 程式人生 > 實用技巧 ># C 語言編寫二進位制/十六進位制編輯器

# C 語言編寫二進位制/十六進位制編輯器

為什麼80%的碼農都做不了架構師?>>> hot3.png

基礎知識

計算機中表示資訊的最小單位是 bit(位),而用來儲存資料的最小單位是 Byte(位元組)。因為儲存資料的最小單位是位元組,所以檔案長度不存在 4bit 或者 1bit 這種表示。

編寫十六進位制編輯器

資料視覺化

每次從檔案讀取 8bit 資料儲存在 unsigned char 型別中,用 printf() 的 %x 引數列印;如果你想列印資料的二進位制形式,只需對 unsigned char 型別資料進行八、十或十六進位制轉二進位制字串在列印即可。

資料編輯

表面上我們的資料儲存在 unsigned char 型別中,編輯的最小單位因該是 unsigned char,如果我們想修改其中任意一位(bit),該如何操作呢?我們舉個例子:

二進位制 0000 0000 的高位設定為 1 該怎麼辦? 二進位制 0000 0000 的十六進位制表示為 0; 二進位制 1000 0000 的十六進位制表示為 80; 所以只要將十六進位制 80 存入檔案,便高位設定為了 1。

解析檔案差異對比工具

檔案儲存的最小單位是位元組(Byte),不存在 4bit 或者 1bit 這種表示。我們可以每次從檔案讀取 8bit 資料儲存在 unsigned char 型別中,然後再相互比較兩個資料即可。

輸入圖片說明

二進位制資料用十六進位制的方式表示,是因為十六進位制最大值 F 剛好儲存在 4bit 中,兩個十六進位制數就佔用 1Byte 的空間。直觀方便易於查閱和修改。旁邊的 ASCII 字元區更多是用來輔助閱覽和編輯的。


我建立了兩個檔案,分別各寫入一個 int 值,下圖是檔案差異:

輸入圖片說明

兩個 int 的值是完全不同的,但他們的差異僅僅只有 1Byte 而已。也就是說這兩個檔案在磁碟中實際上只有一個位元組不同而已。


輸入圖片說明

我向 b.bin 寫入的資料。(a.bin 寫入的是變數 a)

輸入圖片說明

b.c 檔案是 HxD 匯出的二進位制資料。

輸入圖片說明

輸入圖片說明

這是將 unsigned char rawData[] 寫入檔案(c.bin)後再讀取的結果。 也就是說所謂型別對計算機而言是不存在的。

你可能注意到 HxD 的結果為 00 FF FF FF 我的結果為 FF FF FF 00,原因在於我列印的是 int 型資料的十六進位制形式。

轉載於:https://my.oschina.net/bbi094/blog/703283