2

これは私が書いているスクリプトです。

#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あなたの助けと忍耐に感謝します:)

4

1 に答える 1

4

ファイルから削除するようなことはありません。あなたはどちらかでなければなりません

  1. 不要なビットを除いてファイルをコピーするか、または
  2. readファイルの残りの部分seekprint不要なビットの上、そしてtruncateファイル。

私はオプション1で行きました。

$ perl -e'
   binmode STDIN;
   binmode STDOUT;
   local $/; $file = <STDIN>;
   $file =~ s/\0{16}//;
   print $file;
' <file.in >file.out

ファイル全体をメモリにロードしています。どちらのオプションもチャンクで実行できますが、NUL が 2 つのチャンクにまたがる可能性があるため、複雑になります。


不十分な表現の更新では、最初の 0x840 バイトの変更を避けるように要求したようです。2 つのソリューション:

$ perl -e'
   binmode STDIN;
   binmode STDOUT;
   local $/; $file = <STDIN>;
   substr($file, 0x840) =~ s/\0{16}//;
   print $file;
' <file.in >file.out

$ perl -e'
   binmode STDIN;
   binmode STDOUT;
   local $/; $file = <STDIN>;
   print substr($file, 0, 0x840, '');
   $file =~ s/\0{16}//;
   print $file;
' <file.in >file.out
于 2013-02-09T20:20:48.640 に答える