예를 들어, sample.bin
이라는 파일을 만들고 255와 같은 숫자를 넣어서 255가 파일에 리틀 엔디안, FF 00 또는 3826에서 F2 0E로 저장되도록하려고합니다.Perl에서 어떻게 바이너리 파일을 만들 수 있습니까?
perldoc이 말한 것처럼 binmode를 사용하여 시도했습니다.
예를 들어, sample.bin
이라는 파일을 만들고 255와 같은 숫자를 넣어서 255가 파일에 리틀 엔디안, FF 00 또는 3826에서 F2 0E로 저장되도록하려고합니다.Perl에서 어떻게 바이너리 파일을 만들 수 있습니까?
perldoc이 말한 것처럼 binmode를 사용하여 시도했습니다.
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 수행에 대한 정보가 조금 더 있습니다.
예, 사용 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에서 위의 극악을 저질렀다고 생각한다. 그것은 오래 전이었다. 나는 그것을 잊을 수 있었으면 좋겠다 ...
최근에 그것이 굉장하다고 생각한 오래된 코드에서. 그것은 쓰레기 였고, 나는 개입 2 년 동안 많은 프로그래밍을하지 못했습니다. 나는 어딘가에서 당신이 당신의 오래된 코드가 쓰레기라고 생각하지 않는다면 당신에게 잘못된 것이 있다고 생각합니다. .... 내가 기억하기를 바란다. 훌륭한 기사였다. –
누구든지 나를 업신 여서 감사드립니다. 내가 걸었던 소스 파일을 삭제할 수 있으며 치료 프로세스가 시작될 수 있습니다. – pavium
답변이 마음에 들지 않으면 삭제할 수 있습니다. –
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 stict
과 use warnings
이라고 제안 할 것입니다. 또한 오류 메시지에 대한 자세한 설명을 보려면 use diagnostics
을 사용할 수 있습니다. 이 사이트와 Perlmonks은 모두 초보자와 많은 똑똑하고 숙련 된 사람들이 당신을 도울 좋은 정보를 많이 가지고 있습니다.
경로를 선택하기로 결정했다면 pack tutorial을 확인하십시오. 이는 다소 신비로운 팩 문서를 명확히하는 데 도움이됩니다.
팁 및 팩 자습서 링크를 주셔서 감사합니다 :) – domlao
다른 사람이 실제로이 질문에 대해 투표 한 사람들이 뭐가 잘못 되었습니까? –
나는 내 문법이 그리 좋지 않고 구조가 잘되어 있지 않다고 생각한다. – domlao
+ 1을 +1하면 Perl이됩니다. 주관적 느낌. : D –