2013-08-19 4 views
-1

여기에 느슨한 곳이 있습니다. 간단한 문제인 것 같아서 간단한 답이되기를 바랍니다!바이너리에서 2048 바이트마다 64 바이트를 제거하십시오.

바이너리 (약 35m)에는 오프셋 1536부터 시작하여 2048 바이트마다 64 바이트의 패딩 된 데이터가 있습니다.이 패딩을 제거하고 싶습니다. I 해봤

BVI, BBE, 16 진 덤프 SED + + -

최초 발생 등

(더미 데이터의 64 바이트 = 2,048 2,112 바이트) 후 1536 3648,5760,7872이고 xxd와 나는 명확하게 뭔가를 놓치고있다. 당신은 어떤 코드를 보여주지 않았다

+1

무작위로 부정 표가 무엇입니까? – ChargerIIC

+0

파일의 "바이너리"는 어떤 컨테이너입니까? 결과는 어디에서 나옵니까? – martineau

+0

@devnull 정말이 질문에서 주제를 벗어나지 않습니다. – eyquem

답변

2

사전에

덕분에, 그래서 당신이 알고리즘의 주위에 당신의 머리를 포장 도움이 필요한 가정. 그것은 실제로 매우 간단합니다

    당신은 STDIN의 EOF에 도달하지 않은 동안
  1. , 바이트에서 STDIN
  2. 에서
    1. 읽기 2,112 바이트 위치에서 시작하는 64 바이트를 제거 읽기 1536
    2. 남은 2048 바이트를 STDOUT에 인쇄하십시오. 펄에서

,

binmode(STDIN); 
binmode(STDOUT); 
while (1) { 
    my $rv = read(STDIN, my $rec, 2112); 
    die $! if !defined($rv); 
    last if !$rv; 

    substr($rec, 1536, 64, ''); 

    print($rec) 
     or die $!; 
} 
+0

완벽한, 많은 감사합니다! – user2696722

-1

펄 사용하려는 경우 :

열고 :raw 계층으로 파일을. :utf8 또는 :crlf 번역을 원하지 않습니다.

다음, 우리는 우리가 관심있는 위치로 추구 할 수 있고, 몇 바이트

my $size = -s $filename; 
open my $fh, "<:raw", $filename; 
for (seek($fh, 1536, 0) ; tell($fh) + 2048 < $size ; seek($fh, 2048 - 64, 1)) { 
    read $fh, my $buffer, 64; 
    ...; 
} 

에게 읽기

  • perldoc -f tell
  • perldoc -f seek
  • perldoc -f read
를 읽을 수 있습니다

자세한 정보는

+0

그것은 (당신이 기대하는 것처럼) sed로 할 수 있습니다. 만약 OP가 2k를 64b로 삭제하고 싶다면 2k는 64b를 삭제하고 2k는 64b를 삭제하면 64b는 64b를 삭제하지 않을 것입니다. 64b 삭제 ... – Dru