如何查看二进制文件?

Mar*_*tin 75 binary assembly

据我了解,编译器生成一个二进制文件,其中包含 CPU 可以读取的 1 和 0。我有一个二进制文件,但是如何打开它以查看其中的 1 和 0?一个文本编辑器说它无法打开它...

PS 我有一个汇编编译的二进制文件,它应该是 1 和 0 的纯二进制代码?

Rah*_*hul 143

根据这个答案虫族

hexdump -C yourfile.bin 
Run Code Online (Sandbox Code Playgroud)

除非你当然想编辑它。大多数 Linux 发行版hexdump默认都有(但显然不是全部)。


更新

根据此答案埃米利奥·布尔

xxd 二进制和十六进制

对于 bin :

xxd -b file
Run Code Online (Sandbox Code Playgroud)

对于十六进制:

xxd file
Run Code Online (Sandbox Code Playgroud)


Eig*_*ony 50

很多人已经回答了查询的某些方面,但不是全部。

计算机上的所有文件都存储为 1 和 0。图像、文本文件、音乐、可执行应用程序、目标文件等。

它们都是 0 和 1。唯一的区别是根据打开它们的内容,它们的解释不同。

当您使用 来查看文本文件时cat,可执行文件(cat在本例中)会读取所有 1 和 0,并通过将它们转换为相关字母表或语言中的字符来呈现给您。

当您使用图像查看器查看文件时,它会将所有 1 和 0 转换为图像,具体取决于文件的格式和一些逻辑来解决所有问题。

编译后的二进制文件也不例外,它们存储为 1 和 0。

arzyfex 的答案为您提供了以不同方式查看这些文件的工具,但是将文件作为二进制文件读取对于计算机上的任何文件都适用,就像将其查看为八进制、十六进制或实际上是 ASCII 一样,它可能在每个文件中都没有意义这些格式。

如果您想了解可执行二进制文件的作用,您需要以一种向您展示汇编语言(作为开始)的方式查看它,您可以使用它,

objdump -d /path/to/binary

这是一个反汇编程序,它获取二进制内容并将其转换回汇编程序(这是一种非常低级的编程语言)。 objdump并非总是默认安装,因此可能需要根据您的 Linux 环境进行安装。

一些外部阅读。

注意:正如@Wildcard 指出的那样,重要的是要注意文件不包含字符1 和 0(如您在屏幕上看到的那样),它们包含实际的数字数据,即 (1) 上的单个信息位或关闭 (0)。即使这种描述也只是对事实的近似。他们的关键是,如果你确实找到了一个显示 1 和 0 的查看器,即使它仍然在解释文件中的数据,然后向你显示 0 和 1 的 ASCII 字符。数据以二进制格式存储(请参阅上面的二进制数链接)。 Pierre-Olivier 的社区维基条目更详细地介绍了这一点。


Pie*_*res 15

在底层,文件被编码为 0 和 1 的序列。

但即使是程序员在实践中也很少去那里。

首先(并且比这个关于 0 和 1 的故事更重要),您必须了解计算机操作的任何内容都是用数字编码的。

  • 字符使用数字编码,使用字符集表。例如,当使用 ASCII 编码时,字母“A”的值为 65。见http://www.asciitable.com

  • 一个像素用一个或多个数字编码(有很多图形格式)例如,在标准的 3 色格式中,一个黄色像素被编码为:255 代表红色,255 代表绿色,0 代表蓝色。请参阅http://www.quackit.com/css/css_color_codes.cfm(选择一种颜色并查看 R、G 和 B 单元格)

  • 一个二进制可执行文件是用Assembly 编写的;每条汇编指令都被编码为数字。例如,汇编指令MOVB $0x61,%al由两个数字编码: 176,97 参见http://www.sparksandflames.com/files/x86InstructionChart.html(每条指令都有一个从 00 到 FF 的关联数字,因为使用了十六进制表示法,见下文)

其次:每个数字可以有多种表示符号

假设我有 23 个苹果。

  • 如果我将十个苹果分成一组,我会得到:两组十个苹果和 3 个单独的苹果。这正是我们写 23 时的意思:一个 2(十位),然后是一个 3(单位)。
  • 但我也可以制作一组 16 个苹果。所以我会得到一个 16 人组和 7 个孤苹果。在十六进制表示法中(这就是所谓的 16 基数),我会写:17 (16 + 7)。为与十进制记数法区别,十六进制记数法一般用前缀或后缀表示:17h、#17 或 $17。但是如何表示超过 9 个 Group-of-16,或更多 9 个单独的苹果?简单地说,我们使用从 A (10) 到 F (15) 的字母。数字 31(如 31 个苹果)以十六进制写成 #1F。

  • 在同一条线上,我们可以做一组两个苹果。(以及一组两个一组的两个苹果,即一组 2x2 个苹果,依此类推)。然后 23 是:1 group-of-2x2x2x2-apples, 0 group-of-2x2x2-apples, 1 group-of-2x2-apples, 1 group of 2 apples, and 1 lone apples 将用二进制记为 10111 。

(见https://en.wikipedia.org/wiki/Radix

在物理上,允许两种状态(切换)的机制很容易实现,在磁盘和内存存储中也是如此。

这就是被视为数字的数据和程序以二进制形式编写和操作的原因。

然后根据数据类型翻译成适当的形式(字母 A,黄色像素)或执行(MOV 指令)。

hexdump列出以十六进制形式编码数据(或汇编程序)的数字。然后您可以使用计算器来获得相应的二进制形式。


Tho*_*key 10

我会从od(octal dump) 开始,并且根据系统,可能会发现诸如objdump有用的工具。


the*_*hen 5

您可以在十六进制编辑器中打开它,该编辑器将其显示为一系列十六进制值。 xxd file

你想达到什么目的?

  • 仅此一点对您没有多大帮助。如果您想了解它的具体工作原理,请在 Linux 机器上查看 ELF 文件格式和 https://en.wikipedia.org/wiki/X86_instruction_listings。如果您只想查看编译器生成的代码,请查看使用 gdb 运行它。由于您想获得更多“低级”信息,请查看 nand2tetris.org。对于汇编语言,我听说 6502 和 mips 汇编比 x86_64 / x86 汇编好很多 (2认同)

Lor*_*ner 5

您似乎仍然感到困惑的一个重要部分是:十六进制值只是二进制值的不同表示形式。大多数十六进制编辑器或十六进制转储将以十六进制显示值,因为它比二进制更可读。

例如:

二进制:

xxd -b README.md                                                                
00000000: 00100011 00100000
Run Code Online (Sandbox Code Playgroud)

十进制数是 35 和 32

xxd README.md                                                                   
00000000: 2320
Run Code Online (Sandbox Code Playgroud)

还有十进制的 35 和 32


小智 5

Linux strings命令打印文件中可打印字符的字符串,例如:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp
Run Code Online (Sandbox Code Playgroud)

等等......它比二进制更具可读性。