如何反转二进制文件的内容?

如何反转二进制文件的内容?

我正在解决一个挑战,我发现了一个数据文件没有文件扩展名。该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”使用任何字符作为分隔符。我在二进制文件上尝试过,它似乎有效,但任何确认将不胜感激。

主要优点是它不将文件加载到内存中。

相关内容