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

问题描述 投票:14回答:7

我还没有找到这个特定问题的答案;也许没有一个。但我一直想知道它。

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

最后,有没有办法确定哪个程序将正确打开数据文件?很多时候,特别是对于Windows,文件是孤立的,或者与特定程序无关。在文本编辑器中打开它有时会告诉你它属于哪里,但由于胡言乱语,大部分时间都没有。如果扩展程序未提供任何信息,您如何确定它所属的程序?

binaryfiles
7个回答
16
投票
  • 尝试将文件的二进制值转换为ASCII吗?

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

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

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

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

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


5
投票

二进制文件显示为乱码,因为其中的数据是为机器读取而不是为人类设计的。可悲的是,我们中的一些人习惯于解释胡言乱语 - 尽管有一些专门的工具可以帮助更好地查看数据 - 但大多数人不应该知道。

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

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

加密数据应该看起来像胡言乱语。如果它看起来不像胡言乱语,那么它的加密可能不是很好。


2
投票

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

如前所述,当以不同的方式查看时,这些文件更有意义,例如使用十六进制教程。

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


2
投票

显示看起来很有趣,因为二进制文件可以包含不可打印的字符。显示程序可以用其他东西替换这些字符。

使用十六进制编辑器可以防止这种情况。这样的程序将文件中的每个字节显示为十六进制值。这使得文件的表格视图很好,但普通人破译这个视图并不容易,因为我们不习惯以这种方式查看数据。

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

在Linux中,您可以使用“file”命令来帮助您确定文件类型。 Windows可能会执行相同的程序。


1
投票

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

无论如何,由于二进制文件可以表示为熟悉且不熟悉的字符的随机分类,如果您在编辑器中打开它,该文件将看起来像乱码。

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

无法分辨哪个程序创建了特定文件。特别是,如果程序已加密其数据,则所有希望都将丢失。否则,通常很容易识别某些“签名”。


0
投票

是的,Wordpad和Notepad以及许多其他文本编辑器假设您使用它打开的任何文件都是文本文件,并将尝试显示文件中字节所代表的ASCII字符。

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.