9

为什么如果你在十六进制编辑器中打开一个 EXE,你会看到各种各样的东西。如果计算机只理解二进制,那么文件中不应该只有 2 个可能的符号吗?谢谢

4

8 回答 8

31

您将内容与表示混淆了。计算机上的每个文件都可以用二进制(1 和 0)表示,实际上这就是它通常存储在磁盘(磁性粒子对齐)或 RAM(电荷)上的方式。

您正在使用“十六进制编辑器”查看您的 exe,它使用十六进制数字表示内容。这样做是因为十六进制比二进制更容易理解和导航(比较“FA”和“11111010”)。

所以十六进制符号“C0”表示与二进制“11000000”、“C1”==“11000001”、“C2”==“11000010”等相同的值。

于 2010-03-19T22:46:41.280 回答
15

十六进制值被解释为内存中的二进制值。该软件只会使其对人类更具可读性。

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10 A
1011 = 11 B
1100 = 12 C
1101 = 13 D
1110 =
1111 = 15 楼

于 2010-03-19T22:43:58.427 回答
7

计算机不仅理解二进制,那是一种误解。在最低、最低、最低级别,是的,数字计算机中的数据是一系列 1 和 0。但是计算机 CPU 将这些位组合成字节、字、 dword、 qword等。现代 CPU 处理的基本单位是 dword 或 qword,而不是位。这就是它们被称为 32 位或 64 位处理器的原因。如果您想让它们使用单​​个位,您几乎最终会包含 31 或 63 个无关位。(当您开始处理标志寄存器时,它会变得有点模糊。)

数字计算机在 8 位处理器中真正出现了,因此十六进制成为一种非常有用的显示格式,因为它简洁地用两个字符表示一个字节(8 位)。您正在使用十六进制编辑器,因此它向您显示十六进制,并且由于这种早期的字节方向,它每 8 位向您显示两个字符。不过,这主要是一种展示方式。几乎没有理由它不能为每 4 位显示一个字符或每 16 位显示四个字符,尽管文件系统通常以字节粒度来处理实际数据(以及大得多的块用于存储分配粒度——几乎总是 4k或者更多)。

于 2010-03-19T22:58:11.273 回答
2

A您在屏幕上看到的这个字符只是一个由 1 和 0 组成的图案。这就是我们所有人按照所有标准进行合作的方式,这些标准使所有的 1 和 0 使最终出现在屏幕上的模式可以理解。

字符A的值可以是 65。在二进制中,这是0100 0001但在屏幕上可能是模式

   ##
  #  #
  ####
  #  #
  #  #

在 exe 文件中,很多东西以各种格式存储,浮点数、整数和字符串。这些格式经常被使用,因为它们很容易被计算机直接读取而无需进一步转换。在十六进制编辑器中,您通常能够读取恰好存储在 exe 文件中的字符串。

在计算机中一切都是二进制的

于 2010-03-19T22:49:26.190 回答
1

文件中的每个字符(字节)代表 8 位(8 个 1 或 0)。你看不到位,你看到的是字节(和更大的类型)。

于 2010-03-19T22:46:13.613 回答
1

只有两种可能的状态。你看到的是更大的组合模式,就像句子的唯一组成部分是字母和标点符号一样。

于 2010-03-19T22:46:46.427 回答
-1

所以我在这里给出一个外行的答案。上面其他人的建议是正确的,您可以通过十六进制表示读取二进制。无论如何,大多数数据都保存在整数字节中。例如,压缩算法可能会以奇数位计算压缩表示,但它仍会将其填充到完整字节以保存它。每个字节可以表示为 8 位或 2 个十六进制数字。

但是,这可能不是您所要求的。您很可能在所谓的二进制数据中发现了一些 ascii 数据。为什么?好吧,有时代码不仅仅是为了运行。有时编译器会包含一些人类可读的数据,如果代码崩溃并且您需要访问堆栈跟踪,这些数据可以帮助调试。变量名、行号等。

并不是说我必须这样做。我的代码中没有错误。这是正确的。

于 2010-03-19T23:20:19.543 回答
-2

不要忘记操作系统和磁盘文件系统。他们只能使用其格式的文件。例如,win32 中的可执行文件必须以 PE 标头开头。操作系统在内存中加载exutable并传输控制,在exutables中分类api指令等等......低级指令由CPU执行,因为该级指令已经可能是一组字节。

于 2010-03-19T22:58:12.573 回答