0

首先,我要提到我的 linux mint/ubuntu 系统上发生的任何事情......

udit@udit-Dabba ~/ah $ xxd -r -p input.txt output.txt

udit@udit-Dabba ~/ah $ cat input.txt 
60 00 00 00 00 14 06 20 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 02 00 15 00 15 7A 32 B1 08 
00 00 00 00 50 02 FF FF 7E 95 00 00 00 00 02 29 

udit@udit-Dabba ~/ah $ cat output.txt
` z2P��~�)

udit@udit-Dabba ~/ah $ hexdump -C output.txt 

00000000  60 00 00 00 00 14 06 20  00 00 00 00 00 00 00 00  |`...... ........|
00000010  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 02  00 15 00 15 7a 32 b1 08  |............z2..|
00000030  00 00 00 00 50 02 ff ff  7e 95 00 00 00 00 02 29  |....P...~......)|
00000040

udit@udit-Dabba ~/ah $ od -x output.txt 
0000000 0060 0000 1400 2006 0000 0000 0000 0000
0000020 0000 0000 0000 0100 0000 0000 0000 0000
0000040 0000 0000 0000 0200 1500 1500 327a 08b1
0000060 0000 0000 0250 ffff 957e 0000 0000 2902
0000100

现在,当我在 red hat 上尝试相同的事情时,正在发生一些奇怪的行为。

[root@cc]$ xxd -r -p input.txt output.txt

[root@cc]$ cat input.txt 
60 00 00 00 00 14 06 20 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 02 00 15 00 15 7A 32 B1 08 
00 00 00 00 50 02 FF FF 7E 95 00 00 00 00 02 29 

[root@cc]$ cat output.txt
` P~)[root@cc]$ hexdump -C output.txt 
00000000  60 00 00 00 00 14 06 20  00 00 00 00 00 00 00 00  |`...... ........|
00000010  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 50 02 ff ff  7e 95 00 00 00 00 02 29  |....P...~......)|
00000030

[root@cc]$ od -x output.txt 
0000000 0060 0000 1400 2006 0000 0000 0000 0000
0000020 0000 0000 0000 0100 0000 0000 0000 0000
0000040 0000 0000 0250 ffff 957e 0000 0000 2902
0000060

我无法找出为什么 red hat 和 linux mint/ubuntu 的输出之间会出现这种差异。

如果可能的话,告诉我一些 awk/shell 来代替xxd -r -p

请帮帮我!

编辑:

在 linux mint/ubuntu 系统上..

 udit@udit-Dabba ~/ah $ hexdump -C input.txt
 00000000  36 30 20 30 30 20 30 30  20 30 30 20 30 30 20 31  |60 00 00 00 00 1|
 00000010  34 20 30 36 20 32 30 20  30 30 20 30 30 20 30 30  |4 06 20 00 00 00|
 00000020  20 30 30 20 30 30 20 30  30 20 30 30 20 30 30 20  | 00 00 00 00 00 |
 00000030  0a 30 30 20 30 30 20 30  30 20 30 30 20 30 30 20  |.00 00 00 00 00 |
 00000040  30 30 20 30 30 20 30 31  20 30 30 20 30 30 20 30  |00 00 01 00 00 0|
 00000050  30 20 30 30 20 30 30 20  30 30 20 30 30 20 30 30  |0 00 00 00 00 00|
 00000060  20 0a 30 30 20 30 30 20  30 30 20 30 30 20 30 30  | .00 00 00 00 00|
 00000070  20 30 30 20 30 30 20 30  32 20 30 30 20 31 35 20  | 00 00 02 00 15 |
 00000080  30 30 20 31 35 20 37 41  20 33 32 20 42 31 20 30  |00 15 7A 32 B1 0|
 00000090  38 20 0a 30 30 20 30 30  20 30 30 20 30 30 20 35  |8 .00 00 00 00 5|
 000000a0  30 20 30 32 20 46 46 20  46 46 20 37 45 20 39 35  |0 02 FF FF 7E 95|
 000000b0  20 30 30 20 30 30 20 30  30 20 30 30 20 30 32 20  | 00 00 00 00 02 |
 000000c0  32 39 20 0a 0a 0a 0a 0a                           |29 .....|
 000000c8

在红帽机上..

 [root@cc]$ hexdump -C input.txt
 00000000  36 30 20 30 30 20 30 30  20 30 30 20 30 30 20 31  |60 00 00 00 00 1|
 00000010  34 20 30 36 20 32 30 20  30 30 20 30 30 20 30 30  |4 06 20 00 00 00|
 00000020  20 30 30 20 30 30 20 30  30 20 30 30 20 30 30 0a  | 00 00 00 00 00.|
 00000030  30 30 20 30 30 20 30 30  20 30 30 20 30 30 20 30  |00 00 00 00 00 0|
 00000040  30 20 30 30 20 30 31 20  30 30 20 30 30 20 30 30  |0 00 01 00 00 00| 
 00000050  20 30 30 20 30 30 20 30  30 20 30 30 20 30 30 20  | 00 00 00 00 00 |
 00000060  0a 30 30 20 30 30 20 30  30 20 30 30 20 30 30 20  |.00 00 00 00 00 |
 00000070  30 30 20 30 30 20 30 32  20 30 30 20 31 35 20 30  |00 00 02 00 15 0|
 00000080  30 20 31 35 20 37 41 20  33 32 20 42 31 20 30 38  |0 15 7A 32 B1 08|
 00000090  20 0a 30 30 20 30 30 20  30 30 20 30 30 20 35 30  | .00 00 00 00 50|
 000000a0  20 30 32 20 46 46 20 46  46 20 37 45 20 39 35 20  | 02 FF FF 7E 95 |
 000000b0  30 30 20 30 30 20 30 30  20 30 30 20 30 32 20 32  |00 00 00 00 02 2|
 000000c0  39 20 20 0a                                       |9  .|
 000000c4       
4

4 回答 4

4

我不知道发生了什么,但第三行被红帽吃掉了。

这就是你所要求的。使用 awk+bash 反转 hexdump。

echo 'ibase=16' | cat - hdump | tr ' ' \; | bc | awk '{printf("%c",$0)}'

用 input.txt 替换 hdump

echo 'ibase=16' | cat - input.txt | tr ' ' \; | bc | awk '{printf("%c",$0)}' > output.txt

代码在这里找到: http ://www.unix.com/shell-programming-scripting/132294-reverse-hexdump-without-xxd.html#post302404631

于 2011-11-20T11:10:23.983 回答
3

一个迟到的答案,但希望可以帮助其他阅读本文的人:

xxd 在“-r -p”模式下对空格的处理有问题。当它扫描字符时,如果它连续命中 2 个非十六进制字符,它将丢弃所有内容,直到下一个换行符或文件结尾。如果 2 个连续字符中的第二个本身就是换行符(即,行以空格结尾,后跟换行符),则最终效果将是丢弃整个下一行。

我很确定这是导致 Udit 问题的原因。(我认为他后来添加的 input.txt 的 hexdump 实际上并没有反映该文件的原始状态。)

看起来 xxd 主要作为 vim 发行版的一部分进行维护。我查看了 vim 7.3 中包含的 xxd 源代码,它修复了错误处理问题。不幸的是,没有人费心更新版本号,所以它仍然报告相同的 xxd 1.10 版本字符串。

尝试创建这个测试文件(第一行末尾有 1 个空格,第二行没有空格;在 Linux/Unix 上应该是一个 22 字节的文件;如果你在上面运行“xxd -p”,它应该报告 3230200a34652034662035340a34322034312034340a) :

20 
4e 4f 54
42 41 44

如果您对此运行“xxd -r -p”,并且 xxd 的版本表现出错误处理,您应该会看到它打印出 BAD。使用更新(固定)版本的 xxd,它将打印 NOTBAD。

如果您遇到这种错误处理并且无法更新到 xxd 的较新版本,您可以通过一些 sed 预处理来避免这个问题,例如,

$ sed -e 's/ *//g' -e '/^$/d' input.txt | xxd -r -p > output.txt
于 2012-07-21T02:57:26.230 回答
1

我会说你在 input.txt 文件中有一些不可见的字符,这使得第三行看起来无效。也许无效字符与编码有关,这就是它在一台机器上工作而不在另一台机器上工作的原因。

查看检查结果会很有帮助hexdump -C input.txt

于 2011-11-20T13:18:40.873 回答
0
$ cat foo
60 00 00 00 00 14 06 20 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 02 00 15 00 15 7A 32 B1 08 
00 00 00 00 50 02 FF FF 7E 95 00 00 00 00 02 29

$ cat foo | xxd -r -p | hexdump -C
00000000  60 00 00 00 00 14 06 20  00 00 00 00 00 00 00 00  |`...... ........|
00000010  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 02  00 15 00 15 7a 32 b1 08  |............z2..|
00000030  00 00 00 00 50 02 ff ff  7e 95 00 00 00 00 02 29  |....P...~......)|
00000040
于 2011-11-09T10:54:13.933 回答