컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Friday, June 09, 2006

[Perl] 파일의 CRC (CRC32) 값 구하기 펄 스크립트


액티브펄(ActivePerl)을 설치했다면, 윈도우의 명령 프롬프트를 열고

crc32 <파일 이름>

으로 실행하면 그 파일의 CRC32 가 출력될 것입니다.


액티브 펄의 bin 디렉토리에 다음과 같이 crc32 라는 스크립트가 이미 만들어져 있기 때문입니다.
#! /usr/bin/perl -w
# computes and prints to stdout the CRC-32 values of the given files
use lib qw( blib/lib lib );
use Archive::Zip;
use FileHandle;

my $totalFiles = scalar(@ARGV);
foreach my $file (@ARGV)
{
        if (-d $file)
        {
                warn "$0: ${file}: Is a directory\n";
                next;
        }
        my $fh = FileHandle->new();
        if (! $fh->open($file, 'r'))
        {
                warn "$0: $!\n";
                next;
        }
        binmode($fh);
        my $buffer;
        my $bytesRead;
        my $crc = 0;
        while ($bytesRead = $fh->read($buffer, 32768))
        {
                $crc = Archive::Zip::computeCRC32($buffer, $crc);
        }
        printf("%08x", $crc);
        print("\t$file") if ($totalFiles > 1);
        print("\n");
}


그런데 리눅스나 유닉스에는 확장자라는 개념이 거의 없기 때문에, 위의 파일의 이름도 crc32 로만 되어 있습니다. 이러면 윈도우에서는 실행되지 않습니다. 그래서 액티브펄이, 위의 스크립트를 crc32.bat 이라는 배치 파일로 변환시켜 놓았는데 실은 이것이 실행되는 것입니다.

물론 crc32 라는 파일을 crc32.pl 로 변경해 주면 실행이 되지만, 이것을 굳이 배치 파일로 해놓았더군요. (물론 그렇다고 해서, 배치 파일 문법으로 CRC 값을 구하는 것은 아니고, 내부적으로 펄을 실행시킵니다.)


아무튼 액티브 펄을 설치하면 그 안에 이미 CRC32 계산 스크립트가 들어 있습니다.



여담:
제가 펄로 CRC32를 구하는 스크립트를 만들려고 했는데, 이미 만들어져 있어서 편리하더군요.

위의 스크립트는 Archive::Zip 이라는 펄모듈의 computeCRC32 라는 함수를 뽑아쓰는 것입니다. 위의 스크립트 자체에는 CRC 알고리즘이 없습니다. 펄은 텍스트 파일을 다루는 언어이기에, 이진 데이타를 다루는 알고리즘에는 비효율적입니다. 그러나 Archive::Zip 이라는 모듈은 C로 되어 있기에, 이 스크립트의 속도는 C처럼 빠릅니다.

위의 펄 스크립트로, 675MB 짜리 파일의 CRC32를 구하는 데에, 불과 18초 걸리는군요.

순수한 C로 된, CRC32 계산 유틸리티는 16.7초 걸리는 것에 비하면 아주 약간 느린 정도입니다. 만약 위의 펄 스크립트가 순수한 펄로 되어 있었다면 수십 분은 걸렸을 것입니다.



더 읽기: Perl

0 Comments:

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top