2009-09-23 8 views
32

예를 들어, sample.bin이라는 파일을 만들고 255와 같은 숫자를 넣어서 255가 파일에 리틀 엔디안, FF 00 또는 3826에서 F2 0E로 저장되도록하려고합니다.Perl에서 어떻게 바이너리 파일을 만들 수 있습니까?

perldoc이 말한 것처럼 binmode를 사용하여 시도했습니다.

+2

다른 사람이 실제로이 질문에 대해 투표 한 사람들이 뭐가 잘못 되었습니까? –

+0

나는 내 문법이 그리 좋지 않고 구조가 잘되어 있지 않다고 생각한다. – domlao

+1

+ 1을 +1하면 Perl이됩니다. 주관적 느낌. : D –

답변

38

perl pack 함수는 템플릿에 따라 "바이너리"데이터를 반환합니다. 위의 예에서

open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!"; 
print $out pack('s<',255) ; 
close($out); 

상기 's'는 리틀 엔디안 모드로 출력하는 short (16 비트), 및 힘을 '<'을 말한다.

또한 open을 호출 할 때 ':raw'은 파일 핸들을 중요한 플랫폼 (즉, binmode과 동일 함)에서 바이너리 모드로 전환하도록 지시합니다. PerlIO 매뉴얼 페이지에는 다양한 형식의 I/O 수행에 대한 정보가 조금 더 있습니다.

+0

와우, 고마워. 새로운 PERL 그래서 내가 pack 함수에 대한 perldoc을 방문 할 것 같아요. 덕분에 – domlao

+0

팩 좋은 기능입니다. little-endian 값 대 big-endian 값을 인코딩하는 템플릿 문자에 특히주의하십시오. – mob

+0

Adam과 mobrule에게 감사드립니다. 팩은 완벽합니다! thanks – domlao

4

예, 사용 bin 파일 모드로

(안 교육 경우) 바이너리 파일을 생성에서 내 첫 번째 시도가 binmode STDOUT을 포함하여 엔터테인먼트를 들어

다음과 같은 : 동정을 위하여

sub output_word { 
    $word = $_[0]; 
    $lsb = $word % 256; 
    $msb = int($word/256); 
    print OUT chr($lsb) . chr($msb); 
    return $word; 
} 

이 코드를 사용하지 마십시오! 내가 더 잘 알지 못했던 때가왔다.

아직 논쟁의 여지가 있지만, 여기에 재현되어있어 수 있습니다.은 뇌가 죽은 방법으로도 바이트의 순서를 제어 할 수 있으며, 필자는 '고맙습니다.

더 좋은 방법은 을 Adam Batkin 제안으로 사용하는 것입니다.

필자는 Perl 4에서 위의 극악을 저질렀다고 생각한다. 그것은 오래 전이었다. 나는 그것을 잊을 수 있었으면 좋겠다 ...

+3

최근에 그것이 굉장하다고 생각한 오래된 코드에서. 그것은 쓰레기 였고, 나는 개입 2 년 동안 많은 프로그래밍을하지 못했습니다. 나는 어딘가에서 당신이 당신의 오래된 코드가 쓰레기라고 생각하지 않는다면 당신에게 잘못된 것이 있다고 생각합니다. .... 내가 기억하기를 바란다. 훌륭한 기사였다. –

+1

누구든지 나를 업신 여서 감사드립니다. 내가 걸었던 소스 파일을 삭제할 수 있으며 치료 프로세스가 시작될 수 있습니다. – pavium

+1

답변이 마음에 들지 않으면 삭제할 수 있습니다. –

8

pack을 사용하여 바이너리 데이터를 생성 할 수있다. 복잡한 구조의 경우 Convert::Binary::C이 특히 좋습니다.

CBC는 C 헤더 파일 (디렉토리 또는 스크립트의 변수에서 파싱 됨)을 구문 분석합니다. 헤더의 정보를 pack 또는 unpack 바이너리 데이터로 사용합니다. 이 모듈을 사용하려면 물론

, 그것은 몇 가지 C를 알고하는 데 도움이

CBC는 당신에게 당신의 C 유형에 대한 엔디안과 크기를 지정하는 기능을 제공하고, 당신도 변환하는 기능을 지정할 수 있습니다 원시 Perl 유형과 2 진 파일의 데이터 사이. 이 기능을 사용하여 고정 소수점 숫자 인코딩 및 디코딩을 처리했습니다. 당신의 아주 기본적인 예를 들어

당신은 사용하십시오 : 그것은 단지 하나의 짧은 INT 작업 때문에

use strict; 
use warnings; 

use IO::File; 

use Convert::Binary::C; 

my $c = Convert::Binary::C->new('ByteOrder' => 'LittleEndian'); 

my $packed = $c->pack('short int', 0xFF); 

print $packed; 

my $fh = IO::File->new('outfile', '>') 
    or die "Unable to open outfile - $!\n"; 

$fh->binmode; 

$fh->print($packed); 

CBC 정말,이 예에서 빛나는하지 않습니다.여러 다른 C 헤더에서 가져온 typedef를 가질 수있는 복잡한 구조를 처리해야하는 경우이 도구를 준비하는 것이 매우 행복 할 것입니다.

당신이 Perl을 처음 사용하기 때문에 항상 use stictuse warnings이라고 제안 할 것입니다. 또한 오류 메시지에 대한 자세한 설명을 보려면 use diagnostics을 사용할 수 있습니다. 이 사이트와 Perlmonks은 모두 초보자와 많은 똑똑하고 숙련 된 사람들이 당신을 도울 좋은 정보를 많이 가지고 있습니다.

경로를 선택하기로 결정했다면 pack tutorial을 확인하십시오. 이는 다소 신비로운 팩 문서를 명확히하는 데 도움이됩니다.

+0

팁 및 팩 자습서 링크를 주셔서 감사합니다 :) – domlao

관련 문제