admin 管理员组

文章数量: 887031


2024年1月4日发(作者:loyer是什么意思)

关于二进制文件格式的一点小技巧

了解文件格式和转义字符的性质一直是我的心头肉。我最近发现了一些有用的解释,这些解释启发了我写下我对二进制文件的理解。

计算机如何表示数据

一切都是位和字节,计算机的 1 和 0。人类理解文本,因此我们有程序可以将一系列 1 和

0 转换为我们可以理解的内容。

在 ASCII 字符方案中,可以将单个字节(八个 1 或 0 的序列,或 0-255 之间的数字)转换为字符。例如,字符“A”是十进制数 65、十六进制数 41 或二进制数 01000001。'B' 是十进制数 66,依此类推(见完整图表)。

不相信我?迷你示例时间。

在记事本中创建一个带有单个字母“A”的文件(任何文件名都可以——“”)。

保存文件,右键单击并查看属性——它应该是 1 个字节:记事本以 ASCII 格式存储字符,每个字符一个字节。“磁盘大小”可能更大,因为计算机以固定块(例如 4 KB)分配空间。

找到一个十六进制编辑器(这是一个免费的)并打开您刚刚保存的文件。(在 Linux/Unix 上,使用“od -x ”)。

您只会看到十六进制的单个数字“41”(十进制的 65),十六进制编辑器可能会在侧屏上显示字符“A”(您正在检查的字节的 ASCII 表示)。左边的“0”是字节的地址——程序员喜欢从零开始计数。

十六进制编辑器将所有数据显示为 ASCII 文本,在我们的例子中就是这样。如果你打开一个非 ASCII 文件,里面的数据将显示为 ASCII 字符,尽管它可能并不总是有意义。

尝试打开一个随机的 .exe 以查看其中嵌入了哪些 ASCII 字符串——您通常可以在文件的开头部分找到一些。所有 DOS 可执行文件都以标题“MZ”开头,这是提出文件格式的程序员的姓名首字母。

酷,嗯?这些标题或“幻数”是程序确定它所看到的文件类型的一种方式。如果您打开 PNG

图像,您将看到PNG 标题,其中包含 ASCII 字母“PNG”。

这是怎么回事?

在计算机的内存中, 中仅存储了“65”(十六进制为 41 或二进制为 01000001)。给定信息的上下文(即,记事本需要一个文本文件),计算机知道在屏幕上显示 ASCII 字符“A”。

现在考虑如果你告诉他们写下来,人们将如何存储实际的数值65。作为人类,我们会将它写成两个字符,一个 '6' 和一个 '5',它需要 2 个 ASCII 字符或 2 个字节(同样,“字母”6 可以存储在 ASCII 中)。

计算机会将数字“65”以二进制形式存储为 65,与“a”相同。除了这一次,软件会知道“65”不是字母的代码,它实际上是数字本身。

现在,假设我们要存储数字 4,000,000,000(40 亿)。作为人类,我们会将其写为 4000000000,或 10 个 ASCII 字符(10 个字节)。电脑会怎么做?

单个字节有 8 位,或 2^8 (256) 个可能的值。4 个字节为我们提供 2^32 位,或大约 40 亿个值。所以,我们可以只用 4 个字节存储 40 亿这个数字。

如您所见,以计算机格式存储数字数据可以节省空间。它还节省了计算量——计算机不必在

二进制和 ASCII 之间转换数字。

那么,为什么不使用二进制格式呢?

如果二进制格式更有效,为什么不一直使用它们呢?

 二进制文件对于人类来说很难阅读。当一个人看到一个 4 个字节的序列时,他不知道它意味着什么(它可能是一个以 ASCII 存储的 4 个字母的单词)。如果他看到 10 个

ASCII 字母 4000000000,他就知道这是一个数字。

 二进制文件很难编辑。同理,如果一个人想把 40 亿变成 20 亿,他需要知道二进制表示。使用 ASCII 表示,他可以简单地输入“2”而不是“4”。

 二进制文件很难操作。UNIX 传统有几个简单、优雅的工具来操作文本。通过以标准文本格式存储文件,您可以获得这些工具的强大功能,而无需创建特殊的编辑器来修改您的二进制文件。

 二进制文件可能会令人困惑。当计算机以不同的方式读取数据时,就会出现问题。有一种叫做“NUXI”或字节顺序问题的问题,当两台不同架构的计算机(例如 PowerPC Mac

和 x86 PC)尝试传输二进制数据时就会发生这种情况。以单个字节存储的常规文本是明确的,但要小心unicode。

 效率增益通常不是很大。理想情况下,用二进制表示数字可以节省 3 倍(一个 4 字节的数字可以表示 10 个字节的文本)。但是,这假设您表示的数字很大(像 999 这样的 3 位数字用 ASCII 表示比用 4 字节数字表示更好)。最后,ASCII 实际上每字节仅使用 7 位,因此理论上您可以将 ASCII 打包在一起以获得 1/8 或 12% 的增益。但是,以这种方式存储文本通常不值得麻烦。

二进制文件高效的一个原因是因为它们可以在一个字节中使用所有 8 位,而大多数文本被限制为某些固定模式,留下未使用的空间。但是,通过压缩文本数据,您可以减少使用的空间量并使文本更有效率。

编组和解组数据

旁白:编组总是让我想起警长法警,从而想起牛仔。牛仔与“元帅”的CS意思无关。

有时计算机具有复杂的内部数据结构,需要存储在文件中的链接项目链。编组是获取程序内部数据并将其保存到平面、线性文件的过程。解组是读取线性数据并重新创建计算机最初拥有的复杂内部数据结构的过程。

记事本很简单——它只需要存储原始文本,因此不需要编组。但是,Microsoft Word 必须将文本与其他文档信息(页边距、字体大小、嵌入的图像、样式等)一起存储在单个线性文件中。稍后,它必须读取该文件并重新创建用户的原始设置。

您可以将数据编组为二进制或文本格式——“编组”一词并不表示数据的存储方式。

那么二进制文件格式什么时候有用呢?

在某些情况下,您可能想要使用二进制文件格式。PNG 图像使用二进制格式,因为在创建

小图像文件时效率很重要。然而,PNG 正确地使用二进制格式:它指定字节顺序和字长以避免 NUXI 问题。

使用二进制格式通常是出于商业原因。主要原因是它们更难逆向工程(人类必须猜测计算机如何存储其数据),这有助于保持竞争优势.


本文标签: 二进制 文件 数据 字节 文本