十六进制转储 EXE 文件

Hex Dump EXE File

如何以十六进制形式正确显示 EXE 文件 "C:/Path/To/File.exe" 的内容?到目前为止,我有:

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

我尝试使用 switch 语句(此处未显示)每隔几个字节读取一次并应输出适当的十六进制代码,但它失败了。我应该怎么办?如果有人能帮助我,我将不胜感激。


请注意,答案代码格式不正确且效率很低(来源: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 = "0123456789ABCDEF".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();
            }
        }
    }

URL 显示如何在 C 中转储。搜索页面末尾给出的 C 示例。 此 URL 显示了 C#

中的示例

这里有一些简单的代码,它将一次(步)4 个字节与 space 定界符(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);
}