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

如何编辑二进制文件';s十六进制值使用C#,c#,binary,hex,edit,C#,Binary,Hex,Edit,这是我的问题。我有一个要编辑的二进制文件。当然,我可以使用十六进制编辑器来编辑它,但我需要制作一个程序来编辑这个特定的文件。假设我知道我要编辑的某个十六进制,我知道它的地址等等。假设它是一个16位二进制,地址是00000000,它在第04行,它的值是02。我怎样才能创建一个程序来更改该十六进制的值,并且只需单击按钮即可更改该十六进制的值 我已经找到了谈论类似事情的资源,但我一生都找不到确切问题的帮助 任何帮助都将不胜感激,请不要只告诉我答案,如果有,请尝试解释一下 第一件事可能是理解转换。十六进

这是我的问题。我有一个要编辑的二进制文件。当然,我可以使用十六进制编辑器来编辑它,但我需要制作一个程序来编辑这个特定的文件。假设我知道我要编辑的某个十六进制,我知道它的地址等等。假设它是一个16位二进制,地址是00000000,它在第04行,它的值是02。我怎样才能创建一个程序来更改该十六进制的值,并且只需单击按钮即可更改该十六进制的值

我已经找到了谈论类似事情的资源,但我一生都找不到确切问题的帮助


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

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

在理解了这些内容之后,下一步是准确地找出您要搜索的内容,进行适当的转换,并替换准确的字符串。我建议(如果缓冲区不会太大的话)获取整个十六进制转储并替换您在其中搜索的内容,以避免覆盖重复的二进制序列

希望有帮助

问候,

丹尼斯·M.

我认为最好用一个具体的例子来解释这一点。以下是可执行文件的前32个字节,如Visual Studio的十六进制编辑器所示:

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);
}

我是否正确地理解了您想要覆盖磁盘上已存在的文件中给定位置的几个字节?非常感谢,我能够用这些信息完成我的程序。