web-dev-qa-db-ja.com

ddを使用してバイナリファイルのさまざまな部分を抽出する高速な方法

私は誰かがファイルに対して多くのことを行うことができるプログラムddを手伝ってくれることを望んでいます。

まず、このプログラムを使用してNESをカットしますROM 2つのファイル、グラフィックス、およびコード(1024 Kb for code、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 ...を使用してこれをbytesブロックではありません。しかし、私が持っているddのバージョンはそれをサポートしていないようです。

私はここの誰かがddのバージョンを持っていることを本当に望んでいます。私がやりたかったことは

  • 最初の16バイトのみをスキップする
  • それを512 KBのチャンクに分割して、一度に16バイトよりもはるかに速く処理できるようにします。

私が試した方法の1つは、入力ファイル行の先頭にbs=16 skip=1を配置し、次に出力ファイル行にbs=512kを配置することでしたが、これは機能せず、一度に16バイトしか実行できませんでした。 (私はこのようなたくさんの異なる方法を試しました)

私はddこのページ から取得しましたが、元々は「バイトのカウント」または「バイトのスキップ」オプションがありません。

Visual Studio 2010をダ​​ウンロードしたり、新しいddバージョンを入手するために必要なものをダウンロードしたりする必要はありません。どこを見ても、githubや他の場所でダウンロードできるソースコードファイルしかないからです。 GNUツールは必要ありません。ddだけを使用してください。

Linuxや他のタイプのOSではなく、Windows XPを使用している場合は問題ありません。これが間違ったフォーラムである場合はお詫び申し上げます。 ddについて私が見たほとんどのスレッドは、特にこのスレッドにありました。

3
kuja killer

代わりにGNU coreutils headを使用できます:

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

(これはUnixシェルの構文です。Microsoftのコマンドラインインタープリターを使用している場合は、変更が必要になる場合があります)。

Windowsの古いgnuwin32の代わりにcygwinを検討すると、適切な最新のGNUのような環境(Linux[〜#〜] os [〜#〜]ではありませんが、いくつかのUnix風のカーネルだけですおよび非UnixライクなOS)。

skip_bytesは、2012年にGNU ddに追加されました(coreutils 8.16)。そのgnuwin32の最新バージョンは2005からです(Windows XPの最新バージョンだと思いますが) )GNU coreutils include dd in Cygwin and Git for Windows でコンパイルされたバージョンを見つけることができます少なくとも、どちらにもPOSIXシェルインタープリターが付属しています。CygwinはWindowsのサポートを中止しましたXP circa 2016 ですが、その頃からバージョンをダウンロードできるはずです。 from there たとえば、Git for WindowsはWindowsのサポートを終了しましたXPバージョン2.10.0以降ですが、 まだオンラインで利用可能 、およびその両方です。 coretutils 8.16リリースの日付を延ばしてください。

8