据我了解,编译器生成一个二进制文件,其中包含 CPU 可以读取的 1 和 0。我有一个二进制文件,但是如何打开它以查看其中的 1 和 0?一个文本编辑器说它无法打开它...
PS 我有一个汇编编译的二进制文件,它应该是 1 和 0 的纯二进制代码?
Rah*_*hul 143
Run Code Online (Sandbox Code Playgroud)hexdump -C yourfile.bin
除非你当然想编辑它。大多数 Linux 发行版
hexdump
默认都有(但显然不是全部)。
xxd
二进制和十六进制对于 bin :
Run Code Online (Sandbox Code Playgroud)xxd -b file
对于十六进制:
Run Code Online (Sandbox Code Playgroud)xxd file
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 个苹果。
但我也可以制作一组 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
列出以十六进制形式编码数据(或汇编程序)的数字。然后您可以使用计算器来获得相应的二进制形式。
您可以在十六进制编辑器中打开它,该编辑器将其显示为一系列十六进制值。 xxd file
你想达到什么目的?
您似乎仍然感到困惑的一个重要部分是:十六进制值只是二进制值的不同表示形式。大多数十六进制编辑器或十六进制转储将以十六进制显示值,因为它比二进制更可读。
例如:
二进制:
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)
等等......它比二进制更具可读性。