2017-02-20 4 views
1

Comment afficher correctement le contenu d'un fichier EXE "C: /Path/To/File.exe" en forme hexadécimale? Jusqu'à présent, j'ai:Fichier Hex Dump EXE

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

J'ai essayé d'utiliser une déclaration commutateur (non représenté ici) qui lit tous les quelques octets et doit générer le code hexadécimal approprié, mais il a échoué. Que devrais-je faire? J'apprécierais vraiment si quelqu'un peut m'aider.


Prenez garde que le code de réponse n'est pas bien formaté et est plutôt inefficace (source: https://www.codeproject.com/articles/36747/quick-and-dirty-hexdump-of-a-byte-array), mais je fait un effort pour formater correctement. Code Réponse:

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

Vous essayez de fichier de vidage dans un spécifique format? – Tectrendz

+0

De préférence une chaîne, mais cela n'a pas vraiment d'importance pour moi. Merci. – ComputersAreCool

+0

Un exemple aide-t-il? – Tectrendz

Répondre

1

Voici un code simple qui amalgamer les octets 4 à la fois (étape) avec un séparateur d'espace (delimiter):

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

Votre réponse est très utile (les réponses peuvent être utiles de différentes manières), alors j'ai voté pour. Pour aider à éviter la confusion parmi tout le monde, j'ai décidé de ne pas déplacer le statut «accepté» à votre réponse (c'était toujours très utile), bien que la densité et la qualité de votre code soient élevées. – ComputersAreCool

+0

Il devrait être celui-ci comme l'autre n'est pas considéré comme bon par les normes Stackoverflow car son contenu est purement liens ailleurs –

+0

Dans ce cas, j'ai déplacé le statut "accepté". Nous devrions toujours donner du crédit à Tectrendz pour l'effort. – ComputersAreCool

-1

URL montre comment vidangeurs C. Recherche échantillon C qui est donnée à la fin de la page. Cette URL montre par exemple en C#

+0

Merci pour l'effort, mais je voulais dire C#, pas C (je ne pouvais pas trouver C# là-bas). – ComputersAreCool

+0

Exemple C# ajouté. – Tectrendz

+0

Votre réponse a été très utile. Merci (voté et accepté)! Je vais poster le code dans ma question pour que les gens puissent le voir. – ComputersAreCool