如何使用C#编辑二进制文件的十六进制值

时间:2010-07-10 03:42:26

标签: c# binary hex edit

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

我找到了谈论类似事情的资源,但我无法为我的生活找到确切问题的帮助。

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

2 个答案:

答案 0 :(得分: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更改为0x04:

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

答案 1 :(得分:0)

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

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

希望有所帮助!

的问候,
丹尼斯M。