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

Posted

技术标签:

【中文标题】如何使用 C# 编辑二进制文件的十六进制值【英文标题】:How to edit a binary file's hex value using C# 【发布时间】:2011-03-14 03:54:01 【问题描述】:

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

我找到了讨论类似事情的资源,但我终其一生都找不到确切问题的帮助。

如果有任何帮助,我们将不胜感激,请不要只告诉我答案(如果有的话),而是试着解释一下。

【问题讨论】:

您是否想覆盖磁盘上已存在文件中给定位置的几个字节? 【参考方案1】:

我认为最好用一个具体的例子来解释这一点。以下是 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);

【讨论】:

非常感谢,我能够使用这些信息完成我的程序。【参考方案2】:

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

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

希望有帮助!

问候, 丹尼斯 M.

【讨论】:

以上是关于如何使用 C# 编辑二进制文件的十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

哪个控件可以构建十六进制编辑器?

c# winform 如何实现16进制颜色值的转换

Python - 如何逐字节编辑十六进制文件

Python:如何比较两个二进制文件?

在 C# 中,如何使用十六进制值创建 System.Drawing.Color 对象? [复制]

C# 解析16进制字符串。将16进制字符串转换成明文字符串