2017-02-20 20 views
1

"C:/Path/To/File.exe"を16進数形式で正しく表示するにはどうすればよいですか?これまでのところ、私が持っている:16進数のEXEファイル

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

を私は出力適切な16進コードをすべきであるごとに数バイトを読み込み(ここでは示されていない)スイッチ文を使用してみましたが、それは失敗しました。私は何をすべきか?誰かが私を助けることができれば、本当に感謝しています。


回答コードがうまくフォーマットされていないと(ソース:https://www.codeproject.com/articles/36747/quick-and-dirty-hexdump-of-a-byte-array)かなり非効率的であることに注意してください、私はそれを正しくフォーマットする努力をしませんでした。 回答コード:

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

は、特定の内のファイルをダンプしようとしていますフォーマット? – Tectrendz

+0

文字列が好きですが、それは本当に問題ではありません。ありがとう。 – ComputersAreCool

+0

例は役に立ちますか? – Tectrendz

答えて

1

ここではスペース区切り(区切り文字)と時間(ステップ)でバイト4しこりますいくつかの簡単なコードです:

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

あなたの答えは非常に便利です(回答はさまざまな方法で役立ちます)ので、私はそれに投票しました。誰もが混乱するのを防ぐために、私はあなたのコードの密度と品質は高いものの、 "受け入れられた"ステータスをあなたの答えに移さないことに決めました。 – ComputersAreCool

+0

それは他の1つがStackoverflow標準によって良いとは考えられていないので、他の場所に純粋にリンクされているので、この1つにする必要があります。 –

+0

その場合、私は「受け入れた」ステータスを移動しました。努力のために、我々はまだTectrendzに信用を与えるべきです。 – ComputersAreCool

-1

URLは、ページの最後の方に与えられているCサンプルについてC.検索にダンプする方法を示しています。このURL は、C#での例を示し

+0

努力をいただきありがとうございますが、私はC#を意味しませんでした、C(私はそこにC#を見つけることができませんでした)。 – ComputersAreCool

+0

C#の例が追加されました。 – Tectrendz

+0

あなたの答えは本当に役に立ちました。ありがとうございました!人々に見せるために私の質問にコードを掲載します。 – ComputersAreCool