使用 dd 提取二进制文件不同部分的更快方法

使用 dd 提取二进制文件不同部分的更快方法

我希望有人能够帮助该程序,dd该程序可以对文件执行很多操作。

首先,我使用这个程序将 NES ROM 切成 2 个文件,图形和代码(代码 1024 Kb,图形 512 Kb)。它的开头有一个 16 字节的标头。在将其放入“NESASM”汇编器之前,我必须先删除该标头。

这就是dd发挥作用的地方。我有这个有效的设置。

dd if=MMC5 EXAtt MegaMan3.nes of=PRGrom.bin bs=16 skip=1 count=64k
dd if=MMC5 EXAtt MegaMan3.nes of=CHRgfx.bin bs=16 skip=65537 count=32k

它按照我的意愿跳过前 16 个字节。然而,完成起来很慢。我在谷歌上搜索了很多个小时,在 stackexchange 上看到了大量的线程,关于使用iflag=skip_bytes...来做到这一点字节而不是块。但我的版本dd似乎不支持它。

我真的希望这里有人有一个dd可以上传的版本,支持“跳过字节”命令。我想做的是

  • 仅跳过前 16 个字节
  • 并将其分割成 512 KB 的块,这样它比一次只处理 16 字节要快得多。

我尝试过的一种方法是将bs=16 skip=1at 放在输入文件行的开头,然后bs=512k放在输出文件行上,但这不起作用,它仍然一次只执行 16 个字节。 (我尝试过很多不同的方法,比如这样)

dd这一页最初没有“计数字节”或“跳过字节”选项。

我不想经历下载 Visual Studio 2010 或获取新dd版本所需的任何内容的麻烦。因为我到处看看,只有 github 和其他地方可以下载源代码文件。我不想要所有这些 GNU 工具,仅dd此而已。

我使用的是 Windows XP,而不是 Linux 或其他类型的操作系统(如果有帮助的话)。如果这是一个错误的论坛,我深表歉意。我见过的大多数主题dd都是专门针对这一主题的。

答案1

您可以使用 GNU coreutilshead代替:

{
  head -c 16   > /dev/null
  head -c 1m   > PRGrom.bin
  head -c 512k > CHRgfx.bin
} < 'MMC5 EXAtt MegaMan3.nes'

(这是 Unix shell 语法,如果使用 Microsoft 命令行解释器,您可能需要进行调整)。

您可能需要考虑cygwin而不是gnuwin32在 Windows 上使用古老的环境,这将为您提供更接近现代 GNU 的环境(Linux不是一个操作系统顺便说一句,只是在一些类 Unix 和非类 Unix 操作系统中发现的内核)。

skip_bytes于 2012 年添加到 GNU dd(coreutils 8.16)。 gnuwin32 的最新版本是 2005 年的(尽管我认为这与您的 Windows XP 是同时代的)。您可以找到 GNU coreutils 现代版本的编译版本,dd包括西格文适用于 Windows 的 Git至少,两者都带有 POSIX shell 解释器。 Cygwin 已停止支持 Windows XP大约2016年,但您仍然应该能够下载当时的版本那里例如。 Git for Windows 在 2.10.0 版本之后放弃了对 Windows XP 的支持,但它仍然可以在线使用,并且都晚于 coretutils 8.16 版本。

相关内容