mwultong Blog ... 프로그래밍 / 계산기

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

 
Wednesday, September 06, 2006

[펄/Perl] 이진파일 열기/저장하기 - 바이너리 파일/Binary File Open Save


펄은 텍스트 파일을 다루는 용도로 개발되었기에, 이진파일(Binary File)에는 취약하고 속도도 느립니다. 이진파일을 다루는 데는 C/C++ 가 최고입니다.

그렇지만 펄에도 이진파일을 다루는 기능은 다 갖추어져 있습니다.

open 함수 바로 뒤에 binmode 함수를 사용하면, 지정해준 파일 핸들에 한해서, 모든 입출력 함수들이 이진파일 모드로 작동합니다.


이진파일 속의 바이트들을 읽어서 16진수로 출력하는 예제


#!/usr/bin/perl
use strict; use warnings;

  # 읽기용 파일을, 이진 모드로 열기
  open FH, "<", "in.jpg" or die "$!\n";
  binmode FH;

  while (read FH, $_, 1) {
     printf("%02X ", ord($_));
  }

  close FH;

하드의 "현재 디렉토리"에 in.jpg 라는 사진 파일 즉 이진파일이 있어야 실행되는 예제입니다. jpg 파일을 in.jpg 로 이름을 바꾸고, 이 예제를 실행하면 됩니다.



위의 예제의 실행 결과


예를 들어 이런 식으로, 이진 파일의 각 바이트가 16진수로 변환되어 출력됩니다.
FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 00 64 00 64 00 00 FF EC 00
11 44 75 63 6B 79 00 01 00 04 00 00 00 3C 00 00 FF E2 0C 58 49 43 43
5F 50 52 4F 46 49 4C 45 00 01 01 00 00 0C 48 4C 69 6E 6F 02 10 00 00
6D 6E 74 72 52 47 42 20 58 59 5A 20 07 CE 00 02 00 09 00 06 00 31 00
00 61 63 73 70 4D 53 46 54 00 00 00 00 49 45 43 20 73 52 47 42 00 00
00 00 00 00 00 00 00 00 00 00 00 00 F6 D6 00 01 00 00 00 00 D3 2D 48
50 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 11 63 70 72 74 00 00 01 50 00 00 00 33 64 65 73 63 00 00
01 84 00 00 00 6C 77 74 70 74 00 00 01 F0 00 00 00 14 62 6B 70 74 00
00 02 04 00 00 00 14 72 58 59 5A 00 00 02 18 00 00 00 14 67 58 59 5A
00 00 02 2C 00 00 00 14 62 58 59 5A 00 00 02 40 00 00 00 14 64 6D 6E
64 00 00 02 54 00 00 00 70 64 6D 64 64 00 00 02 C4 00 00 00 88 76 75
65 64 00 00 03 4C 00 00 00 86 76 69 65 77 00 00 03 D4 00 00 00 24 6C
75 6D 69 00 00 03 F8 00 00 00 14 6D 65 61 73 00 00 04 0C 00 00 00 24
74 65 63 68 00 00 04 30 00 00 00 0C 72 54 52 43 00 00 04 3C 00 00 08
0C 67 54 52 43 00 00 04 3C 00 00 08 0C 62 54 52 43 00 00 04 3C 00 00
08 0C 74 65 78 74 00 00 00 00 43 6F 70 79 72 69 67 68 74 20 28 63 29
20 31 39 39 38 20 48 65 77 6C 65 74 74 2D 50 61 63 6B 61 72 64 20 43
6F 6D 70 61 6E 79 00 00 64 65 73 63 00 00 00 00 00 00 00 12 73 52 47
42 20 49 45 43 36 31 39 36 36 2D 32 2E 31 00 00 00 00 00 00 00 00 00
00 00 12 73 52 47 42 20 49 45 43 36 31 39 36 36 2D 32 2E 31 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 58 59 5A 20 00 00 00 00 00 00 F3 51 00 01 00 00 00 01 16 CC 58 59
5A 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 58 59 5A 20 00
00 00 00 00 00 6F A2 00 00 38 F5 00 00 03 90 58 59 5A 20 00 00 00 00
00 00 62 99 00 00 B7 85 00 00 18 DA 58 59 5A 20 00 00 00 00 00 00 24
A0 00 00 0F 84 00 00 B6 CF 64 65 73 63 00 00 00 00 00 00 00 16 49 45
43 20 68 74 74 70 3A 2F 2F 77 77 77 2E 69 65 63 2E 63 68 00 00 00 00
...이하 생략...


jpg 파일은 FF D8... 이라는 바이트들로 시작됩니다. FF D8 이라는 바이트들이 결과에서 정확히 보이고 있습니다.



binmode 함수의 사용법


이런 식으로 사용합니다:
#!/usr/bin/perl
use strict; use warnings;

  ### 이것은 개념도일 뿐, 예제가 아니기에 실행되지는 않습니다 ###


  # 읽기용 파일을, 이진 모드로 열기
  open IN, "<", "in.jpg" or die "$!\n";
  binmode IN;

  # 여기서 본격적인 작업...



  # 쓰기용 파일을, 이진 모드로 열기
  open OUT, ">", "out.jpg" or die "$!\n";
  binmode OUT;

  # 여기서 본격적인 작업...




  # 작업이 다 끝났으면, 파일 핸들 닫기
  close IN;
  close OUT;





tag: perl
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