[英]c# Write to hex file
剛剛制作了一個mod安裝程序來修改游戲文件的十六進制,但似乎無法正確編寫,這是我用來編寫該文件的代碼:
BinaryWriter BWriter = new BinaryWriter(File.OpenWrite(HexFile));
for (int i = value; i < value2; i++)
{
BWriter.BaseStream.Position = i;
BWriter.Write(NewHex);
}
這是它應該寫的“ NewHex”:
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
但是它並沒有這樣做,而是將十六進制字符串轉換為二進制,然后將其寫入文件,從而產生完全不同的內容,並且在開始處寫了一堆亂碼:在十六進制字符串之前,在這種情況下為2行由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();
}
我可以看到它現在正確地寫入了十六進制,但是仍然存在一個問題,它寫道:
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
有人知道這個問題的解決方案嗎?
我認為StringToByteArray
工作正常。 但是我看到你循環
for (int i = value; i < value2; i++)
{
BWriter.BaseStream.Position = i;
BWriter.Write(StringToByteArray(NewHex));
}
將逐步將1A000000040B19014F0200000A0000000000001B660300000000000016530000
從value
到value2
每個流位置開始的流。 確定需要這個循環嗎?
在您的代碼中,Write方法是String重載版本,這意味着它將您傳遞的確切類型(字符串)轉換為二進制。 BinaryWriter.Write(String)重載-它以單字節長度為字符串加上前綴,這不是您想要的長度。 因此,您將看不到想要在文件中看到的十六進制值。
BWriter.Write(Encoding.ASCII.GetBytes(NewHex));
這也會對您有幫助。 C#:將值寫入二進制(.bin)文件格式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.