为什么在打印时将EXE作为文本显示为“MZ”

时间:2016-01-20 03:19:31

标签: c# portable-executable

String inputFile = "C:\\Users\\Neil\\Desktop\\DCR\\file.exe";
Byte[] bytes = File.ReadAllBytes(inputFile);
String content = Encoding.Default.GetString(bytes);
Console.WriteLine(content);

的输出
  

MZ?

当我尝试将其转到另一个文件时,我得到了

  

MZP

这是什么意思?

1 个答案:

答案 0 :(得分:4)

Windows exe的前几个字节是DOS标头,其结构为:

struct DOS_Header 
 {
     char signature[2] = "MZ";
     short lastsize;
     short nblocks;
     short nreloc;
     short hdrsize;
     short minalloc;
     short maxalloc;
     void *ss;
     void *sp;
     short checksum;
     void *ip;
     void *cs;
     short relocpos;
     short noverlay;
     short reserved1[4];
     short oem_id;
     short oem_info;
     short reserved2[10];
     long  e_lfanew;
 }

将文件作为字符串读取将以MZ开头,然后根据编码解释后续16位整数的方式而有所不同。如果这些单词中的任何一个上的高字节为0,那么也会终止字符串,这就解释了为什么你得到3个字符的输出而没有别的。

具体而言,当MZ?的值为lastsize0x3F的{​​{1}}值为MZP时,会出现输出lastsize