根据"Head First C#"一书中十六进制转储工具稍微修改了一下

 1 static void Main(string[] args)
 2         {
 3             if (args.Length != 1)
 4             {
 5                 Console.Error.WriteLine("usage: hexdmper file-to-dump");
 6                 System.Environment.Exit(1);
 7             }
 8             if (!File.Exists(args[0]))
 9             {
10                 Console.Error.WriteLine("File does not exist: {0}", args[0]);
11                 System.Environment.Exit(2);
12             }
13             using (Stream input = File.OpenRead(args[0]))
14             {
15                 //------记录当前所在字节的位置
16                 int position = 0;
17                 //------缓冲区字节数组,每次处理最多16个字节
18                 byte[] buffer = new byte[16];
19                 //------循环直至流结束位置
20                 while (position < input.Length)
21                 {
22                     //------填充buffer数组,并得到读取的字节数量,可能为0(当文件字节数量正好是16的整数倍)
23                     int byteRead = input.Read(buffer, 0, buffer.Length);
24                     if (byteRead > 0)
25                     {
26                         //------首先写4位16进制的偏移量,后面加个空格
27                         Console.Write("{0}: ", String.Format("{0:x4}", position));
28                         //------更新当前位置
29                         position += byteRead;
30                         //------遍历16个字节的缓冲区的每一位
31                         for (int i = 0; i < 16; i++)
32                         {
33                             //------再写16进制数据,就是刚读的16个字节的数据,有可以小于16字节,所以先判断
34                             if (i < byteRead)
35                             {
36                                 //------以2位16进制输出字节,后面加个空格
37                                 string hex = String.Format("{0:x2}", buffer[i]);
38                                 Console.Write(hex + " ");
39 
40                                 //------不能显示的非打印字符此时可用小点替换,此处250改成了127,因为大于127控制台也显示为?号
41                                 if (buffer[i] < 32 || buffer[i] > 127) { buffer[i] = (byte)'.'; }
42                             }
43                             else
44                                 //------缓冲区“空白”部分输出空格补齐排版
45                                 Console.Write("   ");
46                             //------每循环到中位置加短横线作个分界
47                             if (i == 7)
48                                 Console.Write("-- ");
49                         }
50                         //------取有效的字节转换成字符串
51                         buffer = buffer.Take<byte>(byteRead).ToArray<byte>();
52                         //------根据编码取得更新后的缓冲区内的字符串
53                         string bufferContents = Encoding.UTF8.GetString(buffer);
54                         //------输出整个字符串
55                         Console.WriteLine("   " + bufferContents);
56                     }
57                 }
58             }
59             //Console.ReadKey();
60         }
原文地址:https://www.cnblogs.com/captionAmazing/p/15561549.html