c#写入十六进制文件
刚刚制作了一个mod安装程序来修改游戏文件的hex,但它似乎没有正确地编写它这是我用来编写它的代码: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
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));
}