【问题标题】:Why aren't EXE's in binary?为什么EXE不是二进制的?
【发布时间】:2011-01-29 16:12:08
【问题描述】:

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

【问题讨论】:

  • 因为你是用十六进制编辑器打开的——所以它是十六进制的。用二进制编辑器打开它,你会得到你心爱的零和一。
  • 我不明白为什么人们反对这个。误解内容及其表示方式是一个常见的错误。仅仅因为你觉得这个问题微不足道并不意味着它就不是一个问题。
  • 我猜你的意思是十六进制编辑器中的“ascii”显示。没有多少人会理解我想象的原始 HEX
  • @epatel:那么“原始”十六进制会是什么?
  • @epatel:你的区别没有抓住重点。文件十六进制编辑器显示文件的“原始”十六进制值(在您的示例中为41 31 31 33)。有时他们还会在一侧显示解释为 ASCII 的内容,但这就是人们在这里谈论的内容。

标签: c++ binary executable machine-code


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    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 乙
    1100 = 12 C
    1101 = 13 天
    1110 = 14 E
    1111 = 15 楼

    【讨论】:

    • 好吧,那么实际上还有 8 * 更多的东西,只是它生成了一个 ascii 和其中的二进制文件的十六进制版本?
    • 不,通常一个字节将由 2 个十六进制值(4 位到一个 HEX 字符)表示,可以直接转换为二进制。转换为 ASCII 会导致很多值无法渲染,而且不会是 HEX...
    • @user146780:每个十六进制数字值四个二进制位。这是字节的两个位置值。例如,大写 J 的 ASCII 代码是“4A”。如果代码中存在可打印字符,大多数十六进制编辑器也会显示它们。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 除了在问题中显示在十六进制查看器中时,每个十六进制数字代表二进制文件的 4 位。
          【解决方案7】:

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

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

          我不必这样做。我的代码中没有错误。没错。

          【讨论】:

          • 这是我所见过的对这个基本问题最令人困惑、最误导的答案。
          【解决方案8】:

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

          【讨论】:

          • 这不是 OP 所要求的。
          猜你喜欢
          • 2020-09-25
          • 2011-10-14
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 2019-12-12
          • 2020-02-18
          相关资源
          最近更新 更多