Преобразование неизвестных двоичных данных в серии чисел?(с известным примером) - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь найти способ конвертировать файлы в малоиспользуемом архаичном формате в нечто удобочитаемое человеком ...

В качестве примера, od -x myfile дает:

0000000      2800    4620    1000    461e    c800    461d    a000    461e
0000020      8000    461e    2800    461e    5000    461f    b800    461e
0000040      b800    461d    4000    461c    a000    461e    3800    4620
0000060      f800    4621    7800    462a    e000    4622    2800    463c
0000100      2000    464a    1000    4654    8c00    4693    5000    4661
0000120      7000    46ac    6c00    46d1    a400    4695    3c00    470a
0000140      b000    46ca    7400    46e9    c200    471b    9400    469e
0000160      9c00    4709    cc00    4719    4000    46b0    6400    46cc
...

, который я знаю, соответствует этим целым числам:

10250   10116   10098   10152   10144   10122   10196   10158
10094   10000   10152   10254   10366   10910   10424   12042
12936   13572   18886   14420   22072   ...

но я понятия не имею, как преобразовать одно в другое !!

Большое спасибо всем, кто может помочь.

Если возможно, также будут полезны общие советы о том, что попробовать / с чего начать в этой ситуации.

Обновление: Я выложил полный двоичный файл онлайн здесь http://pastebin.com/YL2ApExG и цифры, которым он соответствует здесь http://pastebin.com/gXNntsaJ

В шестнадцатеричном дампе, кажется, чередуются четыре цифры, предположительно, они соответствуют числам, которые я хочу? разделенные либо на 4600, либо на 4700. К сожалению, я не знаю, куда идти отсюда!

Кто-то еще спросил ниже: бинарный файл - это файл .dat, сгенерированный старой программой спектроскопии ... он имеет размер 1336 байт и соответствует 334 целым числам, поэтому он равен четырем байтам на целое число.

1 Ответ

1 голос
/ 24 ноября 2011

Ну, это то, что вы можете сделать -

Шаг I: выполните od -x файла и перенаправьте его во временный файл (например, hexdump.txt)

od -x myfile > hexdump.txt

Шаг II: Теперь у вас будет текстовый файл, содержащий шестнадцатеричные значения, которые вы можете просмотреть с помощью команды cat.Примерно так -

[jaypal~/Temp]$ cat hexdump.txt
0000000      2800    4620    1000    461e    c800    461d    a000    461e
0000020      8000    461e    2800    461e    5000    461f    b800    461e
0000040      b800    461d    4000    461c    a000    461e    3800    4620
0000060      f800    4621    7800    462a    e000    4622    2800    463c
0000100      2000    464a    1000    4654    8c00    4693    5000    4661
0000120      7000    46ac    6c00    46d1    a400    4695    3c00    470a
0000140      b000    46ca    7400    46e9    c200    471b    9400    469e
0000160      9c00    4709    cc00    4719    4000    46b0    6400    46cc

Шаг III: Первый столбец не очень важен для вас.Столбцы 2-9 важны.Теперь мы удалим файл с помощью AWK, чтобы вы могли преобразовать его в десятичную.Мы добавим пространство, чтобы мы могли рассматривать каждое значение как отдельное поле.Мы также добавим к нему «0x», чтобы мы могли передать его как шестнадцатеричное значение.

[jaypal~/Temp]$ awk '{for (i=2;i<=NF;i++) printf "0x"$i" "}' hexdump.txt > hexdump1.txt

[jaypal~/Temp]$ cat hexdump1.txt
0x2800 0x4620 0x1000 0x461e 0xc800 0x461d 0xa000 0x461e 0x8000 0x461e 0x2800 0x461e 0x5000 0x461f 0xb800 0x461e 0xb800 0x461d 0x4000 0x461c 0xa000 0x461e 0x3800 0x4620 0xf800 0x4621 0x7800 0x462a 0xe000 0x4622 0x2800 0x463c 0x2000 0x464a 0x1000 0x4654 0x8c00 0x4693 0x5000 0x4661 0x7000 0x46ac 0x6c00 0x46d1 0xa400 0x4695 0x3c00 0x470a 0xb000 0x46ca 0x7400 0x46e9 0xc200 0x471b 0x9400 0x469e 0x9c00 0x4709 0xcc00 0x4719 0x4000 0x46b0 0x6400 0x46cc

Шаг IV: Теперь мы преобразуем каждое шестнадцатеричное значение в десятичное с использованием функции printfс AWK.

[jaypal~/Temp]$ gawk --non-decimal-data '{ for (i=1;i<=NF;i++) printf ("%05d ", $i)}' hexdump1.txt > hexdump2.txt

[jaypal~/Temp]$ cat hexdump2.txt
10240 17952 04096 17950 51200 17949 40960 17950 32768 17950 10240 17950 20480 17951 47104 17950 47104 17949 16384 17948 40960 17950 14336 17952 63488 17953 30720 17962 57344 17954 10240 17980 08192 17994 04096 18004 35840 18067 20480 18017 28672 18092 27648 18129 41984 18069 15360 18186 45056 18122 29696 18153 49664 18203 37888 18078 39936 18185 52224 18201 16384 18096 25600 18124

Шаг V: Форматирование для удобства чтения

[jaypal~/Temp]$ sed 's/.\{48\}/&\n/g' < hexdump2.txt > hexdump3.txt

[jaypal~/Temp]$ cat hexdump3.txt
10240 17952 04096 17950 51200 17949 40960 17950 
32768 17950 10240 17950 20480 17951 47104 17950 
47104 17949 16384 17948 40960 17950 14336 17952 
63488 17953 30720 17962 57344 17954 10240 17980 
08192 17994 04096 18004 35840 18067 20480 18017 
28672 18092 27648 18129 41984 18069 15360 18186 
45056 18122 29696 18153 49664 18203 37888 18078 
39936 18185 52224 18201 16384 18096 25600 18124 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...