c#写入十六进制文件

c#写入十六进制文件,c#,C#,刚刚制作了一个mod安装程序来修改游戏文件的hex,但它似乎没有正确地编写它这是我用来编写它的代码: BinaryWriter BWriter = new BinaryWriter(File.OpenWrite(HexFile)); for (int i = value; i < value2; i++) { BWriter.BaseStream.Position = i; BWriter.Write(Ne

刚刚制作了一个mod安装程序来修改游戏文件的hex,但它似乎没有正确地编写它这是我用来编写它的代码:

BinaryWriter BWriter = new BinaryWriter(File.OpenWrite(HexFile));


        for (int i = value; i < value2; i++)
        {
            BWriter.BaseStream.Position = i;
            BWriter.Write(NewHex);
        }
但它并没有这样做,相反,它将十六进制字符串转换为二进制,然后将其写入文件,从而产生完全不同的结果,并在开始处写入一堆乱码:在十六进制字符串之前,在本例中,由61行组成的两行放在十六进制之前,从而打破了游戏

有人知道这个问题的解决办法吗

谢谢

编辑: 修复了第一个问题,现在写入正确,这是新代码:

 private void button4_Click(object sender, EventArgs e)
    {
        int value = (int)new System.ComponentModel.Int32Converter().ConvertFromString(StartAddr);
        int value2 = (int)new System.ComponentModel.Int32Converter().ConvertFromString(StopAddr);


        //int StopInt = int.Parse(StopAddr);
        BinaryWriter BWriter = new BinaryWriter(File.OpenWrite(HexFile));


        for (int i = value; i < value2; i++)
        {
            BWriter.BaseStream.Position = i;
            BWriter.Write(StringToByteArray(NewHex));
        }

    }
    public static byte[] StringToByteArray(string hex)
    {
        return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();
    }
与此相反:

1A000000040B19014F0200000A0000000000001B660300000000000016530000

有人知道这个问题的解决方案吗?

我认为
StringToByteArray
工作正常。但是我可以看到你在循环

for (int i = value; i < value2; i++)
{
    BWriter.BaseStream.Position = i;
    BWriter.Write(StringToByteArray(NewHex));
}
for(int i=value;i

从每个流位置开始,将
1A000000040B19014F0200000A000000000001B6603000000000000016330000
逐渐写入流,从
value
写入
value2
。确实需要此循环吗?

在代码中,Write方法是字符串重载版本,这意味着它会将传递给它的确切类型(字符串)转换为二进制。BinaryWriter.Write(String)重载—它以单字节长度作为字符串的前缀,这不是您想要的。因此,您将无法在文件中看到希望看到的十六进制值

Write(Encoding.ASCII.GetBytes(NewHex))

这对你也有帮助。

好的,虽然你可能有一个游戏的十六进制模型,但你知道游戏文件是二进制的,因此十六进制只是人类的解释,对吧?@BugFinder修复了第一个问题,但是仍然有一个奇怪的乱七八糟的事情:/你没有显示足够的代码来显示你在哪里设置数据写入。确实是循环导致它复制了第一个字节,所以我只是将基流设置为值,它就工作了!谢谢@USER 265899,如果有帮助的话,考虑一下答案。
1A000000040B19014F0200000A0000000000001B660300000000000016530000
for (int i = value; i < value2; i++)
{
    BWriter.BaseStream.Position = i;
    BWriter.Write(StringToByteArray(NewHex));
}