博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
# C 语言编写二进制/十六进制编辑器
阅读量:6157 次
发布时间:2019-06-21

本文共 981 字,大约阅读时间需要 3 分钟。

  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

你可能感兴趣的文章
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>
高仿UC浏览器弹出菜单效果
查看>>
Ubuntu忘记密码,进不了系统的解决方法
查看>>
[原创]白盒测试技术思维导图
查看>>
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>