【问题标题】:hexdump and xxd produce different outputs on red hat and ubuntu/minthexdump 和 xxd 在 red hat 和 ubuntu/mint 上产生不同的输出
【发布时间】:2011-11-09 10:39:35
【问题描述】:

首先,我要提到我的 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       

【问题讨论】:

  • 如果有人能告诉我可以使用哪个选项/命令来代替 xxd -r -p 这可以帮助我
  • 如果input.txt 文件在两台机器上应该是相同的,请检查md5sum input.txt 是否在两台机器上提供相同的哈希(否则,复制失败:可能是硬件故障。 ..).

标签: linux shell redhat hexdump xxd


【解决方案1】:

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

这是你要求的。使用 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

【讨论】:

  • 对我的脚本几乎没有修改它为我工作...thanx
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    查看hexdump -C input.txt 的结果以进行检查会很有帮助。

    【讨论】:

    • 没有什么奇怪的,但是你确定文件在redhat机器上是一样的吗?你能在那里运行同样的命令吗?
    • 是的,你是对的,它们不一样...我也为 red hat m/c 添加了转储。请看一下..
    • @UditGupta 不同之处仅在于行尾的空格和最后的几行空行,这应该没有区别,在我的机器上它们的工作方式相同。您确定您使用的是这些完全相同的文件吗?因为在最后一次转储中,shell 提示符不同(没有 [root@cc]$)。
    • ohhh... 那是我的错误 shell 提示是相同的我已经编辑了问题。即使尝试 marinara 下面建议的 awk/bash 变体,结果也没有改变,结果与现在相同.
    【解决方案4】:
    $ 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
    

    【讨论】:

    • @UditGupta:嗯,我无法准确复制你所做的,因为我没有你的输入文件。
    • 拥有encrypt_data.txt 文件或output.bin 文件的精确逐字节副本真的很有帮助。你能把od -x的输出粘贴到它们上面吗?
    • 现在我已经完全修改了问题,如果你能得到任何提示,请看看。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2016-04-12
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多