2013-02-09 1 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 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 

다른 파일에 0x45000하지만 오프셋에서 "F2 78 6E는"위의 예에서,라고 말할 면도하는 데 필요한 00 00은 다른 오프셋에서 시작할 것입니다. 어떻게 코드를 작성하여 00 00's을 프 i (prune) 할 수 있습니까? 내가 여는 파일에서? 좀 더 구체적으로 질문 할 필요가 있으면 물어보십시오. 긴 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); 

모든 당신의 도움과 인내 :

+1

'$ infile'을 열었지만'STDIN'을 읽었습니다. 파일 내용을 파일 핸들로 덮어 씁니다. (변수 이름이 표준 이하임을 보여주기 위해 파일 핸들에'..._ fh'를 사용하십시오.) 당신은 무엇을 인쇄 할지를 말하지 않았습니다. – ikegami

+0

나는 그것을 좋은 사람으로주고있다. 나는 오늘 밤에 포기하고 내일 좀 더 할 거라고 생각해. 지금까지 모든 도움에 감사드립니다.하지만 나 자신을 분명히하기 위해서, 내가하고 싶은 것은 추출 된 59kn 파일을 열고 00의 몇 행을 지우는 것입니다. 쉬운 소리. 나는 HxD를 열고 수동으로 할 수 있지만 두 번 클릭하기 만하면 멋진 스크립트가 훨씬 쉽게 만들어 준다. 나는이 파일들을 매일 작업하며 수동으로 검사해야하며, 파일의 각 부분을 분리하는 툴을 가지고 있으면 좋을 것이다. 59kb 파일은 단지 16MB 파일의 일부분이다. 하지만 다른 데이터의 대부분은 정적, – james28909

+0

과 나는 그 모든 추출에 어떤 문제가 없어, 그리고 내가 뭘하는지 조금 더 59 킬로바이트를 추출하는 것입니다, 그런 식으로 모든 파일이 끝날 때마다 패딩 될 것입니다 00, 그럼 난 이 스크립트를 삭제하여 00을 (를) 삭제하려고합니다. 어쨌든, 지금까지 모든 yoru 도움을 주셔서 감사합니다. – james28909

답변

4

없음 같은 건 당신에게 ikegami 감사를 파일에서 제거. 당신은 다음 truncate 원하지 않는 비트를 통해 원하지 않는 비트없이

  1. 복사 파일을, 또는
  2. read 파일의 나머지 부분, seek 다시 print 파일을 하나에.

나는 옵션 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

관련 문제