Это мой сценарий, который я пишу.
#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-х
EDIT #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
за вашу помощь и терпение :)
$infile
, но прочитали сSTDIN
. Вы перезаписываете дескриптор файла содержимым файла. (Показывает, что ваши имена переменных не соответствуют стандартам. Используйте..._fh
для дескрипторов файлов.) Вы не сказали, что печатать. - person ikegami   schedule 10.02.2013