究竟是啥导致二进制文件“乱码”?

Posted

技术标签:

【中文标题】究竟是啥导致二进制文件“乱码”?【英文标题】:What exactly causes binary file "gibberish"?究竟是什么导致二进制文件“乱码”? 【发布时间】:2010-09-17 23:32:24 【问题描述】:

我还没有找到这个特定问题的答案;也许没有。但我一直在想这件事。

当您在文本编辑器中查看二进制文件时,究竟是什么导致二进制文件显示为“乱码”?加密文件也是如此。文件的二进制值是否试图转换为 ASCII?是否可以将视图转换为显示原始二进制值,即显示构成文件的 1 和 0?

最后,有没有办法确定哪个程序可以正确打开数据文件?很多时候,尤其是在 Windows 中,文件是孤立的,或者与特定程序无关。在文本编辑器中打开它有时会告诉你它属于哪里,但由于乱码,大多数时候不会。如果扩展程序没有提供任何信息,如何确定它属于哪个程序?

【问题讨论】:

【参考方案1】:

显示看起来很有趣,因为二进制文件可以包含不可打印的字符。由显示程序决定是否将这些字符替换为其他字符。

这可以通过使用十六进制编辑器来避免。这样的程序将文件中的每个字节显示为其十六进制值。这为文件提供了一个很好的表格视图,但对于普通人来说,破译这种视图并不容易,因为我们不习惯以这种方式查看数据。

有几种方法可以找出文件可能属于哪个程序。您可以查看文件的开头,并且通过一些知识,您可能会识别文件类型。有些类型以相同的字符开头(RAR、GIF 等)。对于其他类型,可能就没那么容易了。

在 Linux 中,您可以使用“文件”命令来帮助您确定文件类型。可能有适用于 Windows 的程序可以做到这一点。

【讨论】:

【参考方案2】:

是的,写字板和记事本以及许多其他文本编辑器都假定您使用它打开的任何文件都是文本文件,并且会尝试显示文件中字节所代表的 ASCII 字符。

Hex Editors 用于查看和编辑二进制文件。它们通常将每个字节显示为一对十六进制数字,而不是“1 和 0”,因为这样更容易阅读。

【讨论】:

【参考方案3】:

除了字符编码之类的内容之外,文本编辑器对输入的数据很少做出假设。因此,它将(如您所说)将文件数据读取为 ASCII 并以这种方式显示。由于二进制数据并不总是在字母数字范围内,因此您会胡言乱语。至于显示原始二进制值,您需要像 XVI32 这样的十六进制编辑器。

二进制文件通常在使用它们的程序之外没有上下文。一些二进制格式的开头包含一个 4 字节的魔法序列(例如,Java .class 文件以“CAFE”开头),但要在没有它们的程序的情况下识别它们,您需要这些 4 字节序列的映射。我相信一些 Linux 发行版包含各种二进制格式的此信息,并将检查文件的开头以尝试识别它。除此之外,您无能为力。

【讨论】:

【参考方案4】: 文件的二进制值是否正在尝试转换为 ASCII?

是的,这正是正在发生的事情。通常,文件的二进制值还包括不可打印的 ASCII 控制字符,导致在典型的文本编辑器中显示更加奇怪。

是否可以将视图转换为显示原始二进制值,即 显示构成文件的 1 和 0?

这取决于您的编辑器。您想要的是“十六进制编辑器”,而不是普通的文本编辑器。这将向您显示文件的原始内容(通常是十六进制而不是二进制,因为 0 和 1 会占用大量空间并且难以阅读)。

最后,有没有办法确定哪个程序可以正常打开 数据文件?

有一个名为"file" 的 Linux 命令行程序会尝试分析文件(通常是寻找常见的标题模式)并告诉你它是什么类型的文件(例如文本、音频或视频,或 XML 等)。我不确定是否有适用于 Windows 的等效程序。当然,这个程序的输出只是一个猜测,但是当你不知道一个文件的格式是什么时它会非常有用。

【讨论】:

文件命令已移植到Windows;例如,您可以在 Cygwin 上找到它。 而且无论如何file 肯定不是Linux 程序——它是一个*nix 程序,并且可能也在其他系统上。 Solaris 拥有它很多年了。 “文件”的(嗯,一个)Windows 端口在这里:gnuwin32.sourceforge.net/packages/file.htm【参考方案5】:

二进制文件看起来像乱码,因为其中的数据是为机器读取而不是为人类设计的。可悲的是,我们中的一些人习惯于解释胡言乱语——尽管使用了一些专门的工具来帮助更好地查看数据——但大多数人不需要知道。

文件中的每个字节都被视为当前代码集中的一个字符(在 Windows 上可能是 CP1252)。例如,字节值 65 是“A”;您可以在网络上轻松找到说明性示例。因此,构成二进制数据的字节会根据代码集显示 - 尽在文本编辑器中。它不会尝试转换二进制文件 - 它不知道如何转换(只有原始程序会这样做)。

关于如何检测创建文件的程序 - 您有时可以做到这一点,但并不容易和可靠。在 Unix(或 Windows 上的 Cygwin)上,“文件”程序可能会有所帮助。该程序查看前几个字节来尝试猜测程序。

加密数据应该看起来像乱码。如果它看起来不像乱码,那么它可能没有很好地加密。

【讨论】:

哈哈,“我们中的一些人习惯于解释胡言乱语”——我记得在石器时代曾帮助一位客户解决他的(4800 波特)调制解调器连接问题。我让他通过电话描述了他看到的垃圾,我立即确定了解决他问题的方法。现在想起来有点害怕......【参考方案6】:

二进制文件在标准文本编辑器(如记事本)中查看时显示为乱码的原因是,当使用这些类型的应用程序常用的编码(例如 UTF-8 的 ASCII)显示时,数据被映射为字符它被编码以供显示,这个过程的输出通常对人类没有意义,就像被映射的二进制数据一样,所以你看到的胡言乱语

如前所述,这些文件在以不同方式(例如使用十六进制编辑器)查看时会更有意义。

某些文件类型可以通过给定类型的所有文件中存在的数据来识别,例如所有可执行文件 (*.exe) 都以字母 MZ 开头

【讨论】:

【参考方案7】:

二进制数据通常非常随机。根据定义,特别是加密数据。每个字节可以由 256 个字符之一表示(不包括 Unicode)。 ASCII 仅涵盖其中的 128 个,其中只有 94 个是实际可打印的字符。在 ASCII 范围之外,您有许多国际字符和奇怪的符号。其中肯定有超过 128 个,因此必须指定一个代码页来选择一组特定的符号。

无论如何,由于二进制文件可以表示为非常随机的各种熟悉和不熟悉的字符,如果您在编辑器中打开该文件,它看起来就像是乱码。

您总是可以在十六进制编辑器中打开一个文件(二进制文件或文本文件,实际上没有区别),然后查看原始二进制数据。

没有办法知道是哪个程序创建了一个特定的文件。特别是,如果程序已经加密了它的数据,那么所有的希望都将落空。否则,通常很容易识别某些“签名”。

【讨论】:

以上是关于究竟是啥导致二进制文件“乱码”?的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2D 的可用文件后缀究竟是啥,用于多分辨率支持?

cat二进制文件导致控制台乱码恢复

图解 Google V8 # 10:机器代码:二进制机器码究竟是如何被CPU执行的?

ShellExecute成功后返回值究竟是啥?

如日中天的hadoop究竟是啥??

究竟是什么导致了git中的合并冲突?