Wednesday, September 06, 2006
[펄/Perl] 이진파일 열기/저장하기 - 바이너리 파일/Binary File Open Save
펄은 텍스트 파일을 다루는 용도로 개발되었기에, 이진파일(Binary File)에는 취약하고 속도도 느립니다. 이진파일을 다루는 데는 C/C++ 가 최고입니다.
그렇지만 펄에도 이진파일을 다루는 기능은 다 갖추어져 있습니다.
open 함수 바로 뒤에 binmode 함수를 사용하면, 지정해준 파일 핸들에 한해서, 모든 입출력 함수들이 이진파일 모드로 작동합니다.
하드의 "현재 디렉토리"에 in.jpg 라는 사진 파일 즉 이진파일이 있어야 실행되는 예제입니다. jpg 파일을 in.jpg 로 이름을 바꾸고, 이 예제를 실행하면 됩니다.
예를 들어 이런 식으로, 이진 파일의 각 바이트가 16진수로 변환되어 출력됩니다.
jpg 파일은 FF D8... 이라는 바이트들로 시작됩니다. FF D8 이라는 바이트들이 결과에서 정확히 보이고 있습니다.
이런 식으로 사용합니다:
그렇지만 펄에도 이진파일을 다루는 기능은 다 갖추어져 있습니다.
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;
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
...이하 생략...
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;
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 | 펄
<< Home