这纯粹是出于学术上的好奇,但我经常在 Windows(Windows 10 Pro;64 位)和 Android 上发现不是经过混淆,但在每个实际相关字符之间包含一堆NUL
字符,因此很难在 Windows 上按原样读取(至少在 Android 上,我使用的浏览器应用程序— X-plore— 在编辑模式下以文本形式启动时似乎会自动删除)。以下是示例:
答案1
这是一个二进制文件,其中包含可打印 ASCII 字符。
因为这些字符是“不可打印0x00
“,Notepad++ 将它们显示为描述性块。您可能会看到其他的,如下所示。在这里您可以看到从二进制 0 /到 255 /的所有值0xFF
(这是可以存储在单个字节中的最大值)。
第 1、2 和 3 行显示的值通常称为“控制字符",用于影响终端、光标位置等... a 的NUL
值为 0 / 0x00
。BS
控制字符是 "退格键”,并指示应用程序删除一个字符并将光标向后移动一个空格。值得注意的是“丢失的“或介于BS
和VT
... 之间的不可见字符是”水平制表符“ 和 ”换行“字符 - 前者相当不言自明,而后者会使文本流到下一行。
在第 4 行和第 5 行,您可以看到可打印的整个 ASCII 字符集。空格 ( ) 的二进制值为 32 /
0x20
,感叹号的二进制值为 33 / 0x21
,等等……第 5 行末尾的有趣方框是DEL
控制字符 - 127 / 0x7F
。
所有大于或等于 128 的值都是“扩展 ASCII“,或者也是不可打印的,这些从第 6 行开始显示为它们的原始值 - 例如:x80
。没有一个好的方法来确定如何解释这些 - 一些 DOS 应用程序使用其中一些字符来产生框架围绕“视窗“、终端上的方框或区域。
有关详细信息,请参阅“角色组“wiki 页面的”部分。
在“十六进制编辑器",您通常会看到原始二进制值与 ASCII 表示形式一起。
当文件包含纯文本以外的数据时(例如:它是一个应用程序或其他二进制文件),您会看到很多非打印字符,因为它们从未打算供人类使用...在这样的文件中,数据以二进制形式排列,通常遵循严格的结构或格式。在某些情况下,数据表示大数字(通过将多个字节连接在一起),在其他情况下,它们可能表示“机器码“或直接呈现给处理器的原始指令。
你可能能够看到这些二进制文件中的字符串,但这更“意外地“ 而不是故意的 - 应用程序本身必须知道当您看到消息时要在屏幕上打印什么,这就是那个。
在二进制文件中,字符串编码有几种常见的方式。
1. C 字符串
此格式使用 8 位字符,并以字符终止字符串NUL
。字符串会立即显示在文件中,如下所示 - 请注意终止符NUL
。
2.UTF-16
此格式使用 16 位字符(即:两个字节连接),并且可以表示由以下代码点描述的一部分:统一码。在这里,如果您阅读字符之间,您会看到字符串有点可见NUL
...这种格式在针对 Windows 的应用程序中非常常见。
Logical Disks
你能看到第二行的字符串吗?
二进制文件还可以存储其他资源 - 例如图像、声音、XML、JSON、档案等……然后应用程序可以在必要时在运行时将资源提取到磁盘,或者通常直接从内存中处理它们。
通常可以使用工具以自动化方式提取这些资源,但在某些情况下,文件不是按照开放/通用标准设计的,需要一些人工干预。
答案2
当你创建一个文件来存储数据时,你可以存储一系列字节。1 个字节是 0 到 255 之间的任意数字。在许多文件格式中,使用 0 到 255 之间的任意数字来存储数据就足够了。
但随着系统变得越来越复杂和先进,开发人员有时需要存储远大于 255 的数字。2 个字节 = 256*256 = 65535,4 个字节 = 256*256*256*256 = 4294967296。因此,通过组合 4 个字节,可以存储从 0 到 4294967295 的值。
您甚至可以组合 8 个或更多字节来形成一个数字,这在需要 64 位(8x8 字节)的 64 位应用程序中经常发生。
由于存储的数字通常较低,因此大多数字节为 0,即 NUL。因此,在文件中,您会看到很多 NUL,因为它们都是 64 位结构中的低值。
为什么不优化文件?因为大多数程序员都使用为他们存储数据的函数,并且他们会记住每种情况,包括存储大数字。
答案3
这是存储字符串的一种非常流行的约定:通常程序会知道字符串开始的位置,并且会知道字符串已经结束,因为找到了NUL
(或NULL
或)字符。\0
如果将其与 CSV 进行比较,您可以将其视为分隔各列的逗号。但在这里,它是一个特殊字符,无法键入或打印,除了分隔字符串结尾外没有其他用途。
你可能认为这很脆弱,但它确实会导致无数安全问题。但直到今天,许多字符串仍然以这种方式分隔。
但是,在您的屏幕截图中,这可能具有不同的含义,具体取决于您使用的应用程序。总体而言,二进制数据不能用文本编辑器读取。