2012-11-08 10 views
0

언팩 기능을 사용하여 바이너리 파일의 내용을 16 진수로 변환합니다. 내가으로 그 일을하고펄 언팩과 개행 문자

은 다음과 같습니다

#! /usr/bin/perl 

use strict; 
use warnings; 

my $input=$ARGV[0]; 

open(INPUT,'<',$input) || die("Couldn't open the file, $input with error: $!\n"); 
my $value=<INPUT>; 
$value=unpack("H*",$value); 

print $value,"\n"; 

이는 16 진수 문자열로 바이너리 입력 파일의 내용을 인쇄합니다.

그러나 이진 파일의 내용을 구문 분석하는 동안 0xa (개행 문자) 바이트를 발견하면 해당 위치에서 압축 해제 함수가 중지됩니다.

결과로 $ value 변수에 불완전한 결과가 나타납니다.

몇 가지 예 : 바이트 후

65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 BA DC 95 DC FE BD 

FE FF FF FF 07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 

모든 내용은 0xa는이 압축 풀기에 의해 해석되지 않습니다.

그래서 새로운 줄 문자를 만나면 파싱을 중단하지 않도록 전체 이진 파일을 압축 해제하는 방법이 있습니까?

감사합니다.

+0

좋아, 해결책을 직접 찾았습니다. 파일을 읽기 전에 slurp 모드를 활성화해야합니다. 로컬 $/않습니다 :) –

+1

네온 플래시 : 당신은 자신의 답변으로 그것을 추가하고 받아 들일 수 있습니다. – ysth

답변

3

당신은

my $value = <INPUT>; 

이 무엇을 생각하십니까? 0A까지 읽을 줄을 읽으십시오. 수정 :

my $value; 
{ local $/; $value = <INPUT>; } 

는 또한, 당신은 open

binmode(INPUT); 

을 추가 할 수 있습니다.