hexdump и xxd выдают разные результаты на Red Hat и Ubuntu / Mint - PullRequest
0 голосов
/ 09 ноября 2011

Во-первых, я упоминаю о том, что происходило в моей системе 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

Теперь, когда я попробовал то же самое в красной шляпе, происходит странное поведение.

[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

Пожалуйста, помоги мне !!

EDIT:

В системе 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 голосов
/ 20 ноября 2011

Понятия не имею, что происходит, но третью строку едят в красной шляпе.

Это то, что вы просили. Обратный hexdump с awk + bash.

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

заменить hdump на input.txt

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

3 голосов
/ 21 июля 2012

Поздний ответ, но, надеюсь, может помочь кому-то еще, прочитав это:

У xxd была ошибка обработки пробелов в режиме "-r -p". Поскольку он сканировал символы, если он попадал в 2 последовательных не шестнадцатеричных символа, он отбрасывал бы все до следующего символа новой строки или конца файла. Если второй из 2 последовательных символов сам по себе является символом новой строки (то есть строка заканчивается пробелом, за которым следует символ новой строки), чистый эффект заключается в отбрасывании всей следующей строки.

Я почти уверен, что именно это и стало причиной проблемы Удита. (Я думаю, что hexdump, который он позже добавил в input.txt, на самом деле не отражал исходное состояние этого файла.)

Похоже, что xxd в основном поддерживается как часть дистрибутива vim. Я посмотрел на источник xxd, включенный в vim 7.3, и в нем исправлена ​​проблема с обработкой ошибок. К сожалению, никто не удосуживается обновить версию #, поэтому он по-прежнему сообщает ту же строку версии xxd 1.10.

Попробуйте создать этот тестовый файл (с 1 пробелом в конце первой строки и без пробела во второй; это должен быть 22-байтовый файл в Linux / Unix; если вы запускаете «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
1 голос
/ 20 ноября 2011

Я бы сказал, что у вас есть какой-то невидимый символ в файле input.txt, который делает третью строку как-то недействительной.И, возможно, неверный символ зависит от кодировки, и поэтому он работает на одном компьютере, а не на другом.

Было бы полезно увидеть результат hexdump -C input.txt, чтобы проверить это.

0 голосов
/ 09 ноября 2011
$ 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
...