簡體   English   中英

C#寫入十六進制文件

[英]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));
}

將逐步將1A000000040B19014F0200000A0000000000001B660300000000000016530000valuevalue2每個流位置開始的流。 確定需要這個循環嗎?

在您的代碼中,Write方法是String重載版本,這意味着它將您傳遞的確切類型(字符串)轉換為二進制。 BinaryWriter.Write(String)重載-它以單字節長度為字符串加上前綴,這不是您想要的長度。 因此,您將看不到想要在文件中看到的十六進制值。

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

這也會對您有幫助。 C#:將值寫入二進制(.bin)文件格式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM