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 / 问题 / 528208
Accepted
Andriy Makukha
Andriy Makukha
Asked: 2019-07-04 05:22:27 +0800 CST2019-07-04 05:22:27 +0800 CST 2019-07-04 05:22:27 +0800 CST

在版本 6 Unix 中取消转储 od(八进制或十六进制转储)

  • 772

od(八进制转储)命令自版本 1 起在 Unix 中实现。但是,我在版本 6 Unix 手册(1975 年)中找不到反向命令。现代的反转od方法xxd或sed不适用于 Unix V6,因为sedandawk仅出现在版本 7 中(而uudecode,xxd和base64都不可用)。

问题是:

  • 1975 年的人们如何将八进制或十六进制列表转换为二进制文件?
  • 如何在仅允许我将文本从剪贴板粘贴到终端的 PDP-11 模拟器中执行此操作?(换句话说,有必要为此编写我自己的程序吗?)

这是一个二进制文件的示例十六进制转储od,我想将其转换回二进制文件:

# od -h /bin/sum
0000000 0107 00ba 0000 0204 0000 0000 0000 0001
0000020 1583 0bd6 0ac3 0601 8901 0a37 00ae 15b7
0000040 0002 8905 0000 0000 8609 15c0 0001 8904
0000060 0026 0005 01ef 706f 6472 000a 1001 0a05
0000100 1040 8903 00be 0200 870b 0bc0 030e 0ab7
0000120 007a 15c2 00be 9484 6105 0b45 7e04 01f0
0000140 15c0 0001 8904 0080 0002 09f7 0026 15c0
0000160 0001 8904 0083 0001 1dc5 0050 09f7 0014
0000200 15c0 0001 8904 0082 0001 1040 8906 01c2
0000220 203f 200a 1026 1066 1141 09f7 0006 1581
0000240 1580 0087 0a00 7217 000a 1066 1001 0302
0000260 09f7 fff0 15b7 0012 65f7 0030 000c 15c0
0000300 0001 8904 00ba 0001 0087
0000312 
od hex
  • 2 2 个回答
  • 1310 Views

2 个回答

  • Voted
  1. Best Answer
    Andriy Makukha
    2019-07-06T02:43:32+08:002019-07-06T02:43:32+08:00

    看起来 Unix 版本 6 还没有包含许多只出现在版本 7 中的常用工具(如sed和awk)。那时,Unix 还没有商业化,所以“反向十六进制转储”可能会丢失,这仅仅是因为对该操作没有广泛的需求,或者因为 Ken(或其他一些程序员)从他们/usr在贝尔实验室的非官方目录中提供了这样的工具。谁知道。

    但这是我在 Unix V6 上反转十六进制转储的实现。当像 一样编译时cc -s -O unhex.c,生成的可执行文件只有 1160 字节,并且比转储更快(如预期的那样)。

    请注意当时的 C 语言如何仍然具有 B ( , 等) 的复合赋值语法,=+以及=*它如何期望程序员为文件 I/O 提供自己的缓冲区。

    /* reverse "od -h" operation on Unix V6 */
    /* written in pre-K&R C */
    /* derived from wc.c and cvopt.c */
    
    int ibuf[259];
    int obuf[259];
    
    main(argc,argv)
    char **argv;
    {
        int token, bytecnt;
        register char *p1, *p2;         /* input buffer pointers */
        register int c;                 /* char or read count */
        char sp, b1, b2, lastc, lastb2, nfirst;
    
        obuf[0] = 1;                    /* standard output by default */
        if (argc>2) {
                                        /* create output file */
                if ((obuf[0] = creat(argv[2], 0666)) < 0) {
                        diag(argv[2]);
                        diag(": failed to create\n");
                        return;
                }
        }
        if (argc>1 && fopen(argv[1], ibuf)>=0) {
                p1 = 0;
                p2 = 0;
                sp = 0;
                token = 0;
                bytecnt = 0;
                nfirst = 0;
                for(;;) {
                        /* reading from file */
                        if (p1 >= p2) {
                                p1 = &ibuf[1];
                                c = read(ibuf[0], p1, 512);
                                if (c <= 0)
                                        break;
                                p2 = p1+c;
                        }
                        /* decoding loop */
                        c = 0;
                        c =| *p1++;
                        if (c==' ' || c=='\n') {
                                b1 = token;
                                b2 = token >> 8;
                                if (lastc!=' ' && lastc!='\n') {
                                        /* end of token */
                                        if (sp>0) {
                                                if (nfirst) putc(lastb2, obuf);
                                                putc(b1, obuf);
                                                lastb2 = b2;
                                                nfirst = 1;
                                        } else {
                                                /* first token in the line */
                                                bytecnt = token;
                                        }
                                }
                                if (c==' ') sp++;
                                else {
                                        /* new line */
                                        sp = 0;
                                        fflush(obuf);
                                }
                                token = 0;
                        } else {
                                /* actual hex and octal conversion */
                                token =* sp>0 ? 16 : 8;
                                token =+ c<='9' ? c-'0' : c-'W';
                        }
                        lastc = c;
                }
                if (!(bytecnt & 1)) {
                        putc(lastb2, obuf);
                        fflush(obuf);
                }
                close(ibuf[0]);
                close(obuf[0]);
        } else if (argc>1) {
                diag(argv[1]);
                diag(": cannot open\n");
        } else {
                diag("error: filename missing\n");
        }
    }
    
    diag(s)
    char *s;
    {
        while(*s)
                write(2,s++,1);
    }
    

    UPD。我在GitHub 上发布了一个更快、更简单的版本,其中还突出显示了语法。

    • 3
  2. meuh
    2019-07-05T05:00:07+08:002019-07-05T05:00:07+08:00

    这是一个您可以尝试在 V6 Unix 中编译的最小 C 程序。

    #define EOF (-1)
    int main(){
      int i,a,b;
      while(scanf("%*7o") != EOF){
        for(i = 0; i<8; i++)
          if(scanf("%2x%2x",&a,&b) != EOF){putchar(a); putchar(b);}
      }
    }
    

    如果结果以字节交换结束,您可能需要反转 2 个 putchar。

    • 2

相关问题

  • od 命令打印所有值

  • `od`不能显示二进制数是正确的吗?

  • od 如何处理`\x7f` 之后的符号?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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