将未知二进制数据转换为一系列数字? (用一个已知的例子)

时间:2011-11-24 03:27:49

标签: unix binary

我正试图找到一种方法,将一种使用过时的古老文件格式的文件转换成人类可读的东西......

例如,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个整数,所以每个整数是4个字节。

1 个答案:

答案 0 :(得分:1)

这就是你能做的 -

第一步:执行文件的od -x并将其重定向到临时文件(例如hexdump.txt)

od -x myfile > hexdump.txt

第二步:您现在将拥有一个包含十六进制值的文本文件,您可以使用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

第三步:第一栏对你来说并不重要。第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

第四步:现在我们将使用带有AWK的printf函数将每个十六进制值转换为十进制。

[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

第五步:格式化以便于阅读

[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