这是我的问题。我有一个二进制文件需要编辑。当然,我可以使用十六进制编辑器进行编辑,但我需要编写一个程序来编辑这个特定的文件。假设我知道要编辑的某个十六进制值,我也知道它的地址等信息。 假设这是一个16位二进制文件,地址为00000000,位于第04行,值为02。我该如何创建一个可以在单击按钮时仅更改该十六进制值的程序?
我找到了类似事情的资源,但我无法找到确切问题的帮助。
任何帮助将不胜感激,请不要只是告诉我答案,而是尽量解释一下。
这是我的问题。我有一个二进制文件需要编辑。当然,我可以使用十六进制编辑器进行编辑,但我需要编写一个程序来编辑这个特定的文件。假设我知道要编辑的某个十六进制值,我也知道它的地址等信息。 假设这是一个16位二进制文件,地址为00000000,位于第04行,值为02。我该如何创建一个可以在单击按钮时仅更改该十六进制值的程序?
我找到了类似事情的资源,但我无法找到确切问题的帮助。
任何帮助将不胜感激,请不要只是告诉我答案,而是尽量解释一下。
我认为这最好通过一个具体的例子来解释。以下是在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);
}
首先,你需要了解转换。十六进制转十进制可能不是很重要(除非你需要先将值从十进制转换,但这是一个简单的转换公式),但是十六进制转二进制将非常重要,因为每个十六进制字符(0-9,A-F)对应一个特定的二进制输出。
在理解了这些内容之后,下一步是确定你要搜索的内容,进行适当的转换,并替换该精确字符串。我建议(如果缓冲区不太大)将整个十六进制转储并替换其中的任何搜索内容,以避免覆盖重复的二进制序列。
希望这有所帮助!
祝好!
丹尼斯·M。