2013-02-09 16 views
2

Это мой сценарий, который я пишу.perl искать и удалять при различных смещениях в binmode

#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

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 за вашу помощь и терпение :)

+1

Вы открыли '$ infile', но читали из' STDIN'. Вы перезаписываете свой дескриптор файла содержимым файла. (Идет, чтобы показать, что ваши имена переменных не соответствуют стандарту. Используйте '..._ fh' для дескрипторов файлов.) Вы не сказали, что печатать. – ikegami

+0

Поверь мне, я дал ему хороший человек. Я думаю, что сегодня я уйду сегодня и сделаю еще завтра. спасибо за вашу помощь.но чтобы я мог понять, все, что я хочу сделать, это открыть извлеченный файл 59kn и удалить несколько строк из 00; s с конца lol. звучит достаточно легко. Я могу открыть HxD и сделать это вручную, но хороший сценарий, чтобы просто дважды щелкнуть, делает его намного легче для меня. Я ежедневно работаю с этими файлами и должен их вручную проверять, и было бы неплохо иметь инструмент, разделяющий каждую часть файла, файл 59kb - это всего лишь часть 16-мегабайтного файла. но многие другие данные являются статическими, – james28909

+0

, и у меня нет никаких проблем при извлечении этого, и то, что я делаю, извлекает чуть больше 59 кб, таким образом, каждый файл будет заполнен в конце с 00, тогда i хотите добавить этот скрипт, чтобы удалить их. в любом случае, спасибо за все, что помогло до сих пор человеку. – james28909

ответ

4

Нет такой вещи, как удаление из файла. Вы должны либо

  1. копия файл без нежелательных бит, или
  2. read остальной части файла, seek назад, print над нежелательными битами, то truncate файл.

Я пошел с вариантом 1.

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

я загружаю весь файл в память. Любой вариант может быть выполнен в кусках, но это усложняет ситуацию, потому что ваши NUL могут охватывать два куска.


В плохо обновленном обновлении вы, похоже, попросили избежать изменений в первых байтах 0x840. Два решения:

$ 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 
+1

Вы должны были сказать мне, почему мое решение было недостаточно. Я заметил ваше обновление как случайность. – ikegami

+0

оригинальный пост обновлен. когда я запускаю это, он пытался запустить, но зависает с мигающим курсором. – james28909

+0

, пожалуйста, проявляйте терпение со мной, это опыт обучения для меня. я могу программировать, но я не являюсь промежуточным человеком, поэтому, пожалуйста, имейте терпение;) im learning, lol – james28909

 Смежные вопросы

  • Нет связанных вопросов^_^