我正在解决一个挑战,我发现了一个数据文件没有文件扩展名。该file
命令显示它是一个data file (application/octet-stream)
.该hd
命令显示国民生产总值。在最后一行。所以如果我反转这个文件那么我会得到.PNG格式文件,我到处搜索,但没有找到解释如何反转二进制文件内容的解决方案。
答案1
使用xxd
(来自vim
)和tac
(来自 GNU coreutils,也在tail -r
某些系统上):
< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png
答案2
在zsh
(唯一可以在内部处理二进制数据的shell(除非你想考虑ksh93的base64编码方式)):
zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
LC_ALL=C
: 字符是字节$mapfile[file.gnp]
file.gnp
:文件内容s::
:将字符串拆分为字节组成部分Oa
:对数组O
下标进行反向排序a
答案3
使用 Perl:
perl -0777pe '$_=reverse $_' [input_file]
性能测试:
dd if=/dev/urandom of=/tmp/a bs=1M count=1
LC_ALL=C tac -rs $'.\\|\n' /tmp/a > /tmp/r
time perl -0777pe '$_=reverse $_' /tmp/a | diff -q - /tmp/r
time xxd -p -c1 /tmp/a | tac | xxd -p -r | diff -q - /tmp/r
time perl -0777 -F -ape '$_=reverse@F' /tmp/a | diff -q - /tmp/r
time LC_ALL=C tac -rs $'.\\|\n' /tmp/a | diff -q - /tmp/r
结果:
- 本地测试:我的解决方案是最快的,
perl -0777 -F
也是最慢的。 - 测试于在线尝试一下!:我的解决方案是最快的,
xxd
也是最慢的。
注意:所有解决方案的运行时间diff
应该相同,因为输出应该相同。
答案4
我尝试了以下方法:
tac -rs '.' input.gnp > output.png
这个想法是强制“tac”使用任何字符作为分隔符。我在二进制文件上尝试过,它似乎有效,但任何确认将不胜感激。
主要优点是它不将文件加载到内存中。