我们都知道“a.out”是用于表示目标代码(二进制)的文件格式,并且是汇编器输出的缩写形式,那么cat a.out
也应该给我们二进制,但为什么这种情况不会发生?
我期望输出是纯二进制,我的意思是只有 1 和 0。
答案1
编译后的代码只是一个(通常相当长)的字节序列。如果您cat
使用这样的文件,终端会尝试显示 ASCII/UTF8/UTF16 内具有相同字节值的字符。对于大多数字节组合来说,这会失败,因此结果cat a.out
看起来像乱码。
查看十六进制使用的二进制值
$ od -x a.out
0000000 facf feed 0007 0100 0003 8000 0002 0000
0000020 000f 0000 04b0 0000 0085 0020 0000 0000
0000040 0019 0000 0048 0000 5f5f 4150 4547 455a
0000060 4f52 0000 0000 0000 0000 0000 0000 0000
0000100 0000 0000 0001 0000 0000 0000 0000 0000
...
或者,如果您的系统上有它,
$ hexdump -C a.out
00000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00 |................|
00000010 0f 00 00 00 b0 04 00 00 85 00 20 00 00 00 00 00 |.......... .....|
00000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 |....H...__PAGEZE|
00000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |RO..............|
00000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
...
00000f90 00 00 00 41 53 ff 25 65 00 00 00 90 68 00 00 00 |...AS.%e....h...|
00000fa0 00 e9 e6 ff ff ff 48 65 6c 6c 6f 2c 20 57 6f 72 |......Hello, Wor|
00000fb0 6c 64 21 0a 00 00 00 00 01 00 00 00 1c 00 00 00 |ld!.............|
00000fc0 00 00 00 00 1c 00 00 00 00 00 00 00 1c 00 00 00 |................|
...
答案2
所有文件都只是一个数字序列。正如您所定义的,所有文件都是“纯二进制”。
文件中数字的含义取决于您选择的翻译方式。
让我们举个例子:helloworld.c 文件是一个简单的 C 程序。不是可执行文件,但源代码文件。
该od -t c
程序使用称为“ASCII”的约定将数字转换为“字符”:
~ $ od -t c helloworld.c
0000000 # i n c l u d e < s t d i o .
0000020 h > \n \n i n t m a i n ( i n t
0000040 a r g c , c h a r * * a r
0000060 g v ) { \n \t p r i n t f ( " h
0000100 e l l o w o r l d " ) ; \n } \n
0000120
该od -t x1z
程序将文件的数字转换为十进制数字和字符(在最后一列中):
~ $ od -t x1z helloworld.c
0000000 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e >#include <stdio.<
0000020 68 3e 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 >h>..int main(int<
0000040 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 > argc, char **ar<
0000060 67 76 29 20 7b 0a 09 70 72 69 6e 74 66 28 22 68 >gv) {..printf("h<
0000100 65 6c 6c 6f 20 77 6f 72 6c 64 22 29 3b 0a 7d 0a >ello world");.}.<
0000120
该xdd -b
程序将文件的数字转换为二进制数和字符(在最后一列中):
~ $ xxd -b helloworld.c
00000000: 00100011 01101001 01101110 01100011 01101100 01110101 #inclu
00000006: 01100100 01100101 00100000 00111100 01110011 01110100 de <st
0000000c: 01100100 01101001 01101111 00101110 01101000 00111110 dio.h>
00000012: 00001010 00001010 01101001 01101110 01110100 00100000 ..int
00000018: 01101101 01100001 01101001 01101110 00101000 01101001 main(i
0000001e: 01101110 01110100 00100000 01100001 01110010 01100111 nt arg
00000024: 01100011 00101100 00100000 01100011 01101000 01100001 c, cha
0000002a: 01110010 00100000 00101010 00101010 01100001 01110010 r **ar
00000030: 01100111 01110110 00101001 00100000 01111011 00001010 gv) {.
00000036: 00001001 01110000 01110010 01101001 01101110 01110100 .print
0000003c: 01100110 00101000 00100010 01101000 01100101 01101100 f("hel
00000042: 01101100 01101111 00100000 01110111 01101111 01110010 lo wor
00000048: 01101100 01100100 00100010 00101001 00111011 00001010 ld");.
0000004e: 01111101 00001010 }.
文件的第一个数字可以显示为 35(十进制)、00100011(二进制)、“#”(UTF-8)。这取决于您选择如何翻译它。