AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 457449
Accepted
daya
daya
Asked: 2018-07-21 05:33:20 +0800 CST2018-07-21 05:33:20 +0800 CST 2018-07-21 05:33:20 +0800 CST

为什么“cat a.out”的输出是一些奇怪的文本,而不是二进制?[复制]

  • 772
这个问题在这里已经有了答案:
二进制文件之谜 3 个答案
4年前关闭。

我们都知道“a.out”是用于表示目标代码(二进制)的文件格式,是汇编程序输出的缩写形式,那么cat a.out也应该给我们二进制,但为什么不会发生这种情况呢?

我期望输出是纯二进制的,我的意思是只有 1 和 0。

cat binary
  • 2 2 个回答
  • 3427 Views

2 个回答

  • Voted
  1. Best Answer
    nohillside
    2018-07-21T05:43:09+08:002018-07-21T05:43:09+08:00

    编译后的代码只是一个(通常相当长的)字节序列。如果你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  |................|
    ...
    
    • 4
  2. andcoz
    2018-07-21T07:16:42+08:002018-07-21T07:16:42+08:00

    所有文件都只是一个数字序列。正如您定义的那样,所有文件都是“纯二进制”。

    文件中数字的含义取决于您选择如何翻译它。

    举个例子:文件 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)。这取决于您选择如何翻译它。

    • 2

相关问题

  • 为什么bash之后用文本替换命令替换中的文本

  • 如何将换行符分隔的 ascii 数字流转换为二进制(然后再返回)?

  • 串行设备输出在 gnu 屏幕中看起来不错,但使用 cat 时出现乱码

  • cat heredocument 复制了除函数调用之外的所有内容

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve