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

Unix 将未知二进制数据转换为一系列数字?(举一个已知的例子),unix,binary,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

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

例如,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   ...
但是我不知道如何将一个转换成另一个

非常感谢任何能帮忙的人

如果可能的话,关于在这种情况下尝试什么/从哪里开始的一般提示也将不胜感激

更新:我把完整的二进制文件放在这里,并把它对应的数字放在这里

在十六进制转储中,它似乎在四个数字之间交替,大概它们对应于我想要的数字?被4600或4700分开。不幸的是,我不知道从这里走到哪里


还有人问:这个二进制文件是由一个旧的光谱学程序生成的.dat文件。。。它是1336个字节,对应于334个整数,因此每个整数有4个字节。

这就是你可以做的-

第一步:执行文件的od-x并将其重定向到临时文件(例如hextump.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
[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]$awk'{for(i=2;iI)应该加上“od-d myfile”给出看似合理的数字,但这是错误的:它给出的第一个数字是10240(即10关),其余的都是错误的。我不知道这是否是巧合……我在这里没有深度!你在英特尔处理器(例如PC)上运行了
od
命令吗或摩托罗拉处理器(如Macintosh)?换句话说,输出是大端还是小端?文件中有多少字节,它对应多少整数?我仍然怀疑您是否有有效的转换。但是,您可以使用以下答案将十六进制值转换为十进制值。我在英特尔处理器上运行了它。二进制文件只是一个.dat,1336字节,它对应s到334个整数。谢谢你的努力,但这只会给我与“od-d”相同的输出,因此对我的问题没有多大帮助!我非常感谢awk/sed中的课程,所以你的努力没有白费:)没问题。你能详细说明你面临的问题吗?我以为十六进制到十二进制的转换就是你想要的吗?“
但我不知道如何将一个转换成另一个!!
“当你做
hextump-C binary\u文件时,你会得到什么?你能把它放上去吗?当然!我把它放上去了,因为它不适合放在评论框中。再次感谢!!感谢你的二进制文件的hextump。你是如何得到十进制整数的?它是一个单独的文件还是另一个二进制文件?”?
[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