2016-03-19 6 views
0

はただのゲームファイルの六角を変更するMODインストーラーをしたが、私がそれを書くために使用するコードです正しくそれを書くように見えるしません:C#の書き込み

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 

しかし、それは代わりに、それは16進数文字列をバイナリにすることを変換し、それを行うと、その後は全く違うものになるファイルに書き込み、それが束を書き込みしません。六角弦の前に、この例では61行のうち2行がそのヘックスの前に置かれていたので、breゲームをアスクする

誰にも解決策がありますか?

おかげ

EDIT:

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

私はそれが正しく今の六角を書きましたが、1つの問題が依然として存在していることがわかります。 が正しく書き込まれ、これは新しいコードで、最初の問題を修正しましたこれに代えて

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

「NewHex」とは何ですか? –

+1

OK、ゲームの16進法があるかもしれませんが、ゲームファイルがバイナリであることを知っています。その結果、その16進数は人間の解釈権にすぎませんか? – BugFinder

+0

@BugFinder最初の問題は修正されましたが、まだ変わったことがあります。/ – user265889

答えて

0

私はStringToByteArrayが適切に動作していると思います。しかし、私はあなたがループ

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

徐々にvalueからvalue2にストリーム位置のそれぞれから始まるストリーミングする1A000000040B19014F0200000A0000000000001B660300000000000016530000を書き込むことを見ることができます。このループが必要かどうか確かめてください。

+0

実際には最初のバイトを二重にするループでしたので、ベースストリームを値に設定するだけでした。ありがとう! – user265889

+0

@ user265889、それが助けられたら、答えを[accepting](http://i.stack.imgur.com/QpogP.png)と考えてください。 –

0

あなたのコードでは、WriteメソッドはStringオーバーロードされたバージョンです。つまり、渡した型(文字列)をバイナリに変換します。 BinaryWriter.Write(String)overload - 文字列の先頭に1バイトの長さが付いています。これは必要ではありません。したがって、ファイルに表示する16進数の値は表示されません。

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

これはあなたにも役立ちます。 C#: Write values into Binary (.bin) file format

関連する問題