2016-03-19 8 views
0

gerade einen Mod Installer hex einer Spiel-Datei zu ändern, aber es scheint nicht, es zu schreiben richtig dies ist der Code verwende ich es schreiben:C# schreiben zu Hex-Datei

BinaryWriter BWriter = new BinaryWriter(File.OpenWrite(HexFile)); 


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

Und das ist die „NewHex“, dass er schreiben soll:

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 

Aber es macht das nicht, sondern wandelt sie, dass hex-String in binären und schreibt sie dann in die Datei in etwas resultierenden völlig anders und es schreibt ein Bündel von Kauderwelsch bis zum Anfang: vor der Hex-Saite, in diesem Fall waren 2 Zeilen aus 61 Platz vor diesem Hex so bre aking das Spiel

Kennt jemand eine Lösung für dieses Problem?

Dank

EDIT: das erste Problem wird behoben, schreibt jetzt richtig, das ist der neue Code:

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

Ich kann sehen, dass es die Hex jetzt richtig, aber es ist immer noch ein Thema geschrieben , schreibt es diese:

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 

Statt dessen:

1A000000040B19014F0200000A0000000000001B660300000000000016530000 

Kennt jemand eine Lösung für dieses Problem?

+0

Was ist 'NewHex'? –

+1

ok, während du vielleicht einen hex mod für ein spiel hast, weißt du, dass die spieldatei binär ist, und als folge ist das hex nur eine menschliche interpretation richtig? – BugFinder

+0

@BugFinder Behoben das erste Problem, aber immer noch dieses komische Kauderwelsch-Ding:/ – user265889

Antwort

0

Ich denke StringToByteArray funktioniert ordnungsgemäß. Allerdings kann ich sehen, dass Sie Schleife

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

allmählich 1A000000040B19014F0200000A0000000000001B660300000000000016530000 schreiben von value zu value2 an jedem Stream Startposition zu streamen. Bist du sicher, dass du diese Schleife brauchst?

+0

Es war in der Tat die Schleife, die dazu führte, dass es das erste Byte täuschte, also habe ich einfach den Basisstrom auf Wert gesetzt und es hat funktioniert! Vielen Dank! – user265889

+0

@ user265889, betrachten [akzeptieren] (http://i.stack.imgur.com/QpogP.png) die Antwort, wenn es geholfen hat. –

0

In Ihrem Code ist die Write-Methode die String-überladene Version, was bedeutet, dass sie den exakten Typ konvertiert, den Sie übergeben (string) in binary. Die binaryWriter.Write (String) -Überladung - it setzt die Zeichenfolge mit einer Einzelbyte-Länge voran, was nicht Ihren Vorstellungen entspricht. Daher werden Sie den Hex-Wert nicht sehen, wie Sie in der Datei sehen möchten.

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

Dies würde Ihnen auch helfen. C#: Write values into Binary (.bin) file format