これは私が書いているスクリプトです。
#usr/bin/perl
use warnings;
open(my $infile, '<', "./file1.bin") or die "Cannot open file1.bin: $!";
binmode($infile);
open(my $outfile, '>', "./extracted data without 00's.bin") or die "Cannot create extracted data without 00's.bin: $!";
binmode($outfile);
local $/; $infile = <STDIN>;
print substr($infile, 0, 0x840, '');
$infile =~ s/\0{16}//;
print $outfile;
perl でバイナリ ファイルを読み込んでいます。特定のオフセットでシークしてパッチを適用することができましたが、やりたいことは、" 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
" (16 バイト?) のインスタンスを見つけてファイルから削除できるようにすることですが、16 バイト以上です。それ以下のものは、私が去りたいと思います。一部のファイルでは、00 の開始位置が異なるオフセットになりますが、私の考えが正しければ、00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
そのインスタンスを検索して削除できれば、00 がどのオフセットにあるかは問題になりません。最初に特定のオフセットからデータを抽出し、次にファイルを検索して 00 を削除します。必要な特定のオフセットを既に抽出できます。抽出したファイルを開いて削るだけです。00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
EF 39 77 5B 14 9D E9 1E 94 A9 97 F2 6D E3 68 05
6F 7B 77 BB C4 99 67 B5 C9 71 12 30 9D ED 31 B6
AB 1F 81 66 E1 DD 29 4E 71 8D 54 F5 6C C8 86 0D
5B 72 AF A8 1F 26 DD 05 AF 78 13 EF A5 E0 76 BB
8A 59 9B 20 C5 58 95 7C E0 DB 44 6A EC 7E D0 10
09 42 B1 12 65 80 B3 EC 58 1A 2F 92 B9 32 D9 07
96 DE 32 51 4B 5F 3B 50 9A D1 09 37 F4 6D 7C 01
01 4A A4 24 04 DC 83 08 17 CB 34 2C E5 87 26 C1
35 38 F4 C4 E4 78 FE FC A2 BE 99 48 C9 CA 69 90
33 87 09 A8 27 BA 91 FC 4B 77 FA AB F5 1E 4E C0 I want to leave everything from
F2 78 6E 31 7D 16 3B 53 04 8A C1 A8 4B 70 39 22 <----- here up
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <----- I want to prune everything
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 from here on
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<---- this IS the end of the file, and
just need to prune these few rows
of 00's
F2 78 6E
上記の例の" " は0x45000
オフセットにありますが、別のファイルでは 00 00 は別のオフセットで始まります00 00's
。私が開いているファイルで?もっと具体的に言う必要がある場合は、聞いてください。長い 00 00 文字列に到達するまでファイルを覗いてから、残りの行を削除するようです。それはまったく意味がありますか?私がしたいのは、ファイルを検索して のインスタンスを探し、00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
それを削除/削除/切り捨てることだけです。00以外全部保存したい
編集#2 これでできました:
open($infile, '<', './file1') or die "cannot open file1: $!";
binmode $infile;
open($outfile, '>', './file2') or die "cannot open file2: $!";
binmode $outfile;
local $/; $file = <$infile>;
$file =~ s/\0{16}//g;
print $outfile $file;
close ($infile);
close ($outfile);
ikegami
あなたの助けと忍耐に感謝します:)