刚刚制作了一个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
有没有人知道这个问题的解决方案?
答案 0 :(得分:0)
我认为(color & 0xFF000000) >> 24
正常运作。但是我可以看到你循环
StringToByteArray
会逐渐将for (int i = value; i < value2; i++)
{
BWriter.BaseStream.Position = i;
BWriter.Write(StringToByteArray(NewHex));
}
写入从1A000000040B19014F0200000A0000000000001B660300000000000016530000
到value
的每个流位置开始流式传输。你确定需要这个循环吗?
答案 1 :(得分:0)
在您的代码中,Write方法是String重载版本,这意味着它将您传递的确切类型(字符串)转换为二进制。 BinaryWriter.Write(String)重载 - 它在字符串前面加上单字节长度,这不是你想要的。因此,您不会在文件中看到十六进制值。
BWriter.Write(Encoding.ASCII.GetBytes(NewHex));