基础知识
计算机中表示信息的最小单位是 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 型数据的十六进制形式。