C# 为什么将EXE读取为文本会显示';MZ';印刷时

C# 为什么将EXE读取为文本会显示';MZ';印刷时,c#,portable-executable,C#,Portable Executable,产量 MZ 当我尝试对另一个文件执行此操作时 MZP 这是什么意思 windows exe的前几个字节是DOS标头,其结构如下: 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


这是什么意思

windows exe的前几个字节是DOS标头,其结构如下:

String inputFile = "C:\\Users\\Neil\\Desktop\\DCR\\file.exe";
Byte[] bytes = File.ReadAllBytes(inputFile);
String content = Encoding.Default.GetString(bytes);
Console.WriteLine(content);
以字符串形式读取文件将从
MZ
开始,然后根据您的编码如何解释以下16位整数而有所不同。如果这些字中的任何一个的高位字节为0,那么也将以null结束字符串,这解释了为什么您只得到3个字符的输出,而没有其他字符


具体地说,当
lastsize
的值为
0x3F
时,
MZ?
输出将出现,当
lastsize
的值为
0x50
时,
MZP

为什么要读取EXE文件…?我试图合并EXE文件是出于私人原因…听起来可疑…请检查。将任意字节转换为字符串确实没有实际的理由。@Neiderno By merge是指您想要一个C.EXE,在运行时将执行a.EXE和B.EXE?如果是这样的话,只需将A.EXE和B.EXE都添加为资源,并按说明执行它们即可。@NeilDerno对于初学者来说,您需要完全了解正在使用的二进制格式,然后了解如何读取C#中的二进制数据。虽然编码不会起作用,但您使用的是二进制数据,而不是ASCII或UTF-8或其他文本编码。那么最好不要使用编码,对吗?而是转换为可读的Base64字符串?@NeilDerno除非你想看字节,否则我看不出有理由将其转换为Base64,甚至比十六进制(base16)更常用于将二进制表示为可打印文本。你可能想停下来想一想你想要达到的目标。。。也许像ZIP存档这样的东西会更好地解决你的问题。如果有人好奇,“MZ”来自马克·兹比科夫斯基(MarkZbikowski),他是创建标题格式的功臣。
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;
 }