c#写入hex文件

时间:2016-03-19 13:17:57

标签: c#

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

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


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

这就是&#34; NewHex&#34;它应该写:

1A 00 00 00 04 0B 19 01 4F 02 00 00 0A 00 00 00 00 00 00 1B 66 03 00 00 00 00 00 00 16 53 00 00

但它没有这样做,相反,它将该十六进制字符串转换为二进制,然后将其写入文件,从而产生完全不同的东西。它在开头写了一堆乱码:在十六进制字符串之前,在这种情况下,由61个组成的2条线在该十六进制之前放置,从而打破了游戏

有没有人知道这方面的解决方案?

由于

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

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

我可以看到它现在正确编写了十六进制,但仍有一个问题,它写道:

1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 00 00 00 04 0B 19 01 4F 02 00 00 0A 00 00 00 00 00 00 1B 66 03 00 00 00 00 00 00 16 53 00 00

而不是:

1A000000040B19014F0200000A0000000000001B660300000000000016530000

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

2 个答案:

答案 0 :(得分:0)

我认为(color & 0xFF000000) >> 24正常运作。但是我可以看到你循环

StringToByteArray

会逐渐将for (int i = value; i < value2; i++) { BWriter.BaseStream.Position = i; BWriter.Write(StringToByteArray(NewHex)); } 写入从1A000000040B19014F0200000A0000000000001B660300000000000016530000value的每个流位置开始流式传输。你确定需要这个循环吗?

答案 1 :(得分:0)

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

BWriter.Write(Encoding.ASCII.GetBytes(NewHex));

这对你也有帮助。 C#: Write values into Binary (.bin) file format