如何从八进制转储构建文件?

问题描述 投票:0回答:1

如何解析

od
输出以重建原始二进制文件?

可以使用现有工具来完成吗(例如。

xxd
(似乎仅是十六进制))?

或者使用 Sed/Awk/Perl/Python(或其他脚本语言)?

如果是这样,请提供一个可行的示例。

$ od --version | od > od.version.txt

$ cat od.version.txt
0000000 062157 024040 047107 020125 067543 062562 072165 066151
0000020 024563 034040 031056 005066 067503 074560 064562 064147
0000040 020164 041450 020051 030062 033061 043040 062562 020145
0000060 067523 072146 060567 062562 043040 072557 062156 072141
0000100 067551 026156 044440 061556 005056 064514 062543 071556
0000120 020145 050107 073114 025463 020072 047107 020125 050107
0000140 020114 062566 071562 067551 020156 020063 071157 066040
0000160 072141 071145 036040 072150 070164 027472 063457 072556
0000200 067456 063562 066057 061551 067145 062563 027563 070147
0000220 027154 072150 066155 027076 052012 064550 020163 071551
0000240 063040 062562 020145 067563 072146 060567 062562 020072
0000260 067571 020165 071141 020145 071146 062545 072040 020157
0000300 064143 067141 062547 060440 062156 071040 062145 071551
0000320 071164 061151 072165 020145 072151 005056 064124 071145
0000340 020145 071551 047040 020117 040527 051122 047101 054524
0000360 020054 067564 072040 062550 062440 072170 067145 020164
0000400 062560 066562 072151 062564 020144 074542 066040 073541
0000420 005056 053412 064562 072164 067145 061040 020171 064512
0000440 020155 062515 062571 064562 063556 005056
0000454

解码上面的八进制应该生成一个包含以下文本的文件:

od (GNU coreutils) 8.26
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jim Meyering.
octal od
1个回答
0
投票

是的

xxd
仅是十六进制,但您可以通过将数据转换为(bigendian)十六进制来使用它;给定几乎所有 POSIX shell,除了
zsh
,加上
sed
:

while read x;do set $x; shift; for i do printf '%04x\n' $((0$i)); done; done <77013235.oct | sed 's/\(..\)\(..\)/\2\1/' |xxd -r -p

没有

sed
但有(至少)
ksh93
bash
:

while read x;do set $x; shift; for i do t=$(printf '%04x' $((0$i))); printf %s ${t: 2}${t: 0:2}; done; done <77013235.oct |xxd -r -p

或者使用 GNU awk:

awk -n '{for(i=2;i<=NF;i++){t=sprintf("%04x",("0"$i)+0);printf "%s",substr(t,3)substr(t,1,2)}}' <77013235.oct |xxd -r -p

另一方面,如果没有

xxd
一些shell,至少
ksh93 bash
,可以自己完成这项工作:

while read x;do set $x; shift; for i do t=$(printf '%04x' $((0$i))); printf "\x${t: 2}\x${t: 0:2}"; done; done <77013235.oct

dash
带外部(非内置)
printf

while read x;do set $x; shift; for i do t=$(printf '%04x' $((0$i))); /bin/printf "\x${t#??}\x${t%??}"; done; done <77013235.oct
© www.soinside.com 2019 - 2024. All rights reserved.