2017-02-20 1 views
1

Wie kann ich den Inhalt einer EXE-Datei "C: /Path/To/File.exe" in hexadezimaler Form richtig anzeigen? Bisher habe ich:Hex Dump EXE-Datei

byte[] BytArr = File.ReadAllBytes("C:/Path/To/File.exe") 

Ich habe versucht, einen Schalter Anweisung (hier nicht dargestellt), die alle paar Bytes liest und ausgeben sollte die entsprechende Hexadezimal-Code, aber es ist fehlgeschlagen. Was soll ich machen? Ich würde es wirklich schätzen, wenn mir jemand helfen kann.


Beachten Sie, dass die Antwort-Code nicht gut formatiert und ist ziemlich ineffizient (Quelle: https://www.codeproject.com/articles/36747/quick-and-dirty-hexdump-of-a-byte-array), aber ich habe Mühe machen es richtig zu formatieren. Antwort Code:

using System.Text; 

    namespace HexDump 
    { 
     class Utils 
     { 
      public static string HexDump(byte[] bytes, int bytesPerLine = 16) 
      { 
       if (bytes == null) return "<null>"; 
       int bytesLength = bytes.Length; 

       char[] HexChars = "ABCDEF".ToCharArray(); 

       int firstHexColumn = 
       8     // 8 characters for the address 
      + 3;     // 3 spaces 

       int firstCharColumn = firstHexColumn 
      + bytesPerLine * 3  // - 2 digit for the hexadecimal value and 1 space 
      + (bytesPerLine - 1)/8 // - 1 extra space every 8 characters from the 9th 
      + 2;     // 2 spaces 

       int lineLength = firstCharColumn 
      + bytesPerLine   // - characters to show the ascii value 
      + Environment.NewLine.Length; // Carriage return and line feed (should normally be 2) 

       char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); 
       int expectedLines = (bytesLength + bytesPerLine - 1)/bytesPerLine; 
       StringBuilder result = new StringBuilder(expectedLines * lineLength); 

       for (int i = 0; i < bytesLength; i += bytesPerLine) 
       { 
        line[0] = HexChars[(i >> 28) & 0xF]; 
        line[1] = HexChars[(i >> 24) & 0xF]; 
        line[2] = HexChars[(i >> 20) & 0xF]; 
        line[3] = HexChars[(i >> 16) & 0xF]; 
        line[4] = HexChars[(i >> 12) & 0xF]; 
        line[5] = HexChars[(i >> 8) & 0xF]; 
        line[6] = HexChars[(i >> 4) & 0xF]; 
        line[7] = HexChars[(i >> 0) & 0xF]; 

        int hexColumn = firstHexColumn; 
        int charColumn = firstCharColumn; 

        for (int j = 0; j < bytesPerLine; j++) 
        { 
         if (j > 0 && (j & 7) == 0) hexColumn++; 
         if (i + j >= bytesLength) 
         { 
          line[hexColumn] = ' '; 
          line[hexColumn + 1] = ' '; 
          line[charColumn] = ' '; 
         } 
         else 
         { 
          byte b = bytes[i + j]; 
          line[hexColumn] = HexChars[(b >> 4) & 0xF]; 
          line[hexColumn + 1] = HexChars[b & 0xF]; 
          line[charColumn] = (b < 32 ? '·' : (char)b); 
         } 
         hexColumn += 3; 
         charColumn++; 
        } 
        result.Append(line); 
       } 
       return result.ToString(); 
      } 
     } 
    } 
+0

Versuchen Sie, Datei in einem bestimmten dump Format? – Tectrendz

+0

Vorzugsweise eine Saite, aber das macht mir nichts aus. Vielen Dank. – ComputersAreCool

+0

Hilft das Beispiel? – Tectrendz

Antwort

1

Hier einiger einfachen Code, der die Bytes 4 zu einem Zeitpunkt (Schritt) mit einem Leerzeichen Trennzeichen (Trennzeichen) wird abfinden müssen:

int step = 4; 
string delimiter = " "; 
for(int i = 0; i < BytArr.Length;i += step) 
{ 
    for(int j = 0; j < step; j++) 
    { 
     Console.Write(BytArr[i + j].ToString("X2")); 
    } 
    Console.Write(delimiter); 
} 
+0

Ihre Antwort ist sehr nützlich (Antworten können auf verschiedene Arten nützlich sein), also habe ich sie gewählt. Um Verwirrung bei allen zu vermeiden, habe ich beschlossen, den Status "akzeptiert" nicht in Ihre Antwort zu übernehmen (das war immer noch sehr hilfreich), obwohl die Dichte und Qualität Ihres Codes hoch ist. – ComputersAreCool

+0

Es sollte dies sein, da der andere von Stackoverflow-Standards nicht als gut angesehen wird, da es Inhalt ist rein Links anderswo –

+0

In diesem Fall habe ich den Status "akzeptiert" verschoben. Wir sollten Tectrendz für die Mühe noch danken. – ComputersAreCool

-1

URL zeigt, wie in C. Suche nach C-Probe entleeren, die gegen Ende der Seite gegeben ist. Diese URL zeigt Beispiel in C#

+0

Danke für die Mühe, aber ich meinte C#, nicht C (Ich konnte C# dort nicht finden). – ComputersAreCool

+0

Hinzugefügtes C# -Beispiel. – Tectrendz

+0

Ihre Antwort war sehr hilfreich. Danke (abgestimmt und akzeptiert)! Ich werde den Code in meiner Frage veröffentlichen, damit die Leute ihn sehen können. – ComputersAreCool