2010-07-10 44 views
9

因此,这是我的问题。我有一个我想编辑的二进制文件。我当然可以用十六进制编辑器编辑它,但我需要编写一个程序来编辑这个特定的文件。假设我知道一个我想编辑的十六进制数,我知道它是地址等。假设它是一个16位二进制数,地址是00000000,它在第04行,它的值为02.我怎么能创建一个程序会改变那个十六进制的值,只有那个点击一个按钮的十六进制?如何使用C编辑二进制文件的十六进制值#

我发现有关类似事情的资源,但我无法为我的生活寻找帮助确切的问题。

任何帮助,将不胜感激,请,不要只告诉我,如果有一个答案,但尝试解释一下。

+0

我能得到它correclty要覆盖在给定位置的几个字节的文件已经在磁盘上? – 2010-07-10 05:04:07

回答

21

我认为这是最好的一个具体的例子说明。下面是在Visual Studio中的十六进制编辑器显示的前32个字节的可执行文件:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 

现在文件确实是字节只是一个线性序列。您在十六进制编辑器中看到的行只是为了使事情更易于阅读。如果要使用代码操作文件中的字节,则需要通过基于0的位置来标识字节。在上述例子中,是非零的字节位置如下:

Position Value 
-------- ------ 
    0  0x4D 
    1  0x5A 
    2  0x90 
    4  0x03 
    8  0x04 
12  0xFF 
13  0xFF 
16  0xB8 
24  0x40 

在上面所示的十六进制编辑器的表示,在左边的数字表示在相应的行中的第一个字节的位置。编辑器每行显示16个字节,所以它们每行增加16(0x10)。

如果您只想取出文件中的一个字节并更改其值,那么我所看到的最有效的方法就是使用FileStream打开文件,找到适当的位置并覆盖该字节。例如,下面将在24位改变0x40的为0×04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { 
    stream.Position = 24; 
    stream.WriteByte(0x04); 
} 
+0

非常感谢,我能用这些信息完成我的程序。 – 2010-07-10 15:10:36

0

那么第一件事可能是理解转换。十六进制到十进制可能不是那么重要(除非当然需要先从小数点开始更改值,但这是一个简单的转换公式),但十六进制到二进制将很重要,因为每个十六进制字符(0-9,AF )对应于特定的二进制输出。

理解完这些东西之后,下一步就是找出你正在搜索的内容,进行正确的转换,并替换确切的字符串。我会建议(如果缓冲区不会太大)采取整个十六进制转储并替换您在那里搜索的任何内容,以避免覆盖重复的二进制序列。

希望有帮助!

问候,
丹尼斯M.

相关问题