答案1
戳任何通过随机的文本编辑器编辑二进制数据将导致文件发生未定义的、潜在有害的改变,类似于使用“文本”FTP 传输模式传输二进制文件。
由于 ASCII/ANSI 是一个 7 位字符集,因此未定义高位设置字符的使用。
因此,如果您使用的是 ANSI 文本编辑器,则可能会删除每个字节的顶部位并损坏文件。您将拥有相同的字节数,因此文件大小将相同,但您将丢失可执行文件运行所需的 1/8 的数据。
更智能的文本编辑器可能只要您将所有数据保存为类似 UTF-8(无 BOM)的格式,就可以保留所有数据,但如果不尝试的话,我不会相信它适用于二进制数据。
使用 Explorer(或同等程序)的复制程序以适当的方式复制粘贴文件要容易得多,因为它将是精确的复制而不是由文本编辑器假定为文本。
答案2
最可能的问题是您使用的文本编辑器搞错了不可打印的字符,搞错了行尾,或者两者兼而有之。
不可打印字符:有许多字符集,例如 ASCII 和 Unicode,每个字符集都支持一种或多种编码。编码定义从数字(二进制数据分组)到字符(或字符集中的“代码点”)的映射。在众多字符集和编码中,Unicode 字符集(ASCII 的超集)及其 UTF-8 或 UTF-16 编码(两者都以不同的方式基于 ASCII)可能是最常见的。但是,并非所有数字都映射到“真实”字符。在某些编码中,某些二进制值不是有效字符。此外,其中一些字符是“控制”字符,旨在用于非常古老的远程电传打字机等东西。有些是奇怪的东西,例如“铃声”字符(如果将其打印到控制台,它会发出哔哔声)。还有 NULL 字符(通常编码为 0,所有位未设置),用于指示一些常见编程语言(如 C)中字符串(文本块)的结尾;文本编辑器可能无法很好地处理这些问题,但它们会出现在可执行文件中。
无论如何,文本编辑器不知道如何表示这些。它可能只是将它们显示为方块或其他东西,但是当您复制它时,它可能会将字符复制为方块,而不是其底层字符代码。或者当您粘贴它时,它可能会做类似的事情。由于 EXE 文件由机器代码(二进制数据,不打算表示为文本)组成,因此它将包含一堆这些不可打印的字符。
行尾:在大多数字符集中,有两个字符(有时)用于行尾。它们是回车(在旧式电传打字机中,这意味着“将打印头移回左边缘”),并且换行(前进到该页的下一行)。请参阅维基百科。Windows 会同时使用这两种字符,通常是成对出现的;如果一行不是以 CRLF 结尾,某些编辑器会认为该行根本没有结束,并只添加一个不可见的字符(如果您使用箭头键向左/向右移动,您会被它“绊倒”,光标看起来不会移动)。其他编辑器会将 CRLF、LF 或甚至 CR(尽管自从经典 MacOS 使用该行结尾以来就不再使用)全部视为有效的行结尾。
当您复制粘贴行尾不一致的内容时,就会出现问题。许多文本编辑器都足够“聪明”,可以“修复”您的行尾。在 Windows 系统上,这可能意味着将所有单独的 LF 以及单独的 CR 转换为 CRLF 组合。这会将新数据添加到 EXE 中,这当然会改变机器代码的含义。
正如@Ramhound 的评论所说,如果你想复制粘贴 EXE(或任何其他非文本二进制文件)的内容,你需要使用二进制编辑器(其中大多数通常称为十六进制编辑器因为它们将文件中的每个字节表示为十六进制值,从 00 到 FF,但它们也会将可打印的字节解码为文本。二进制编辑器不会错过不可打印的字符,也不会尝试“修复”您的行尾,或诸如此类的事情。