관리 메뉴

드럼치는 프로그래머

[C/C++] 텍스트 파일과 바이너리 파일의 차이점은?? 본문

★─Programing/☆─C | C++

[C/C++] 텍스트 파일과 바이너리 파일의 차이점은??

드럼치는한동이 2009. 1. 30. 09:09

파일 확장자가 txt 인 파일을 우리는 흔히 텍스트 파일이라 부른다. 그리고 바이너리 파일의 대표는 exe 파일이 있다.

 

그럼 이 두가지 파일의 차이점이 무엇일까?? 말그대로 텍스트 파일은 글자를 그대로 저장한다는 말이고 바이너리 파일은 2진법의 형태로 저장했다는 말이다. (물론 텍스트 파일도 2진법(바이너리)으로 저장되긴 하지만 ASCII코드표대로 저장된 파일을 특별히 텍스트 파일이라 부른다.) 이게 무슨 말인가??

 

글자를 표현하는데에는 ASCII 코드라는 코드표가 사용된다.

 

 이 아스키 코드는 1바이트 (8bit) 로 하나의 문자를 표시한다. 예를 들면 영문자 'A'를 아스키 코드로 표시하면 십진수 65, 이진수(bit) 01000001 로 표시된다, 'B'는 십진수 66, 이진수 01000010 이다.(왜? A라는 문자를 그대로 쓰지않고 이진수로 표현하는가 하면 컴퓨터는 0과 1 이 두가지 밖에 알지 못하기 때문이다. 그래서 우리가 사용하는 문자들을 0과 1로 변환 시켜주기위해 이런 코드표를 쓰는것이다.). 이말은 아스키 코드를 사용하면 총 256가지의 문자(2의 8승)를 만들 수 있다는 소리이다. (우리 키보드에 있는 문자중 한글을 제외한 모든 문자들은 전부 아스키코드로 표현된다. 한글의 표현 방법은 다음에 살표보자)  그럼 텍스트 파일로 저장 한다 하면 아스키코드로 저장된다고 생각하면 된다. 그러면 'ABC123' 이라는 문자를 저장하면 어떻게 될까? 010000010100001001000011001100010011001000110011  으로 저장된다. 총6바이트 이다. 이말은 텍스트모드로 저장하면 글자한자당 무조건 1바이트(한글은 2바이트다) 차지 한다는 말이다.

 

그럼 바이너리로 저장하면 어떻게 될까? 물론 문자를 바이너리로 저장하는 프로그램은 없다(있을수도 있다 ^^;;). 바이너리 형식으로 저장되는 파일은 대부분 어떤 작업에 대한 결과물로 나온 데이터를 저장하는데 쓰인다. 우리가 흔히 말하는 exe 파일도 프로그램을 짜서 이걸 컴파일과 링크라는 과정을 거쳐 나온 결과물이다. 이렇게 프로그램적으로 데이터를 처리하면 결과값은 바이너리로 나오게 되어있다(컴퓨터의 연산결과값이므로). 그래서 이것을 그대로 파일로 저장하면 도통 뭔 말인지 알아 볼 수 없는 파일이 되는 것이다.(한번 메모장으로 exe 파일이나 gif, jpg 파일들을 불러 보기 보세요..)

 

그러면 어떤 형식으로 저장될까?? 그야 프로그램마다 틀리지만 대부분 이런형식으로 저장된다. 숫자를 예로 들면 123456 이라는 정수를 저장한다고 쳐보자. 보통 컴퓨터에서는 정수를 Integer 형이라고 부른다. integer a; 라고 선언하면 'a'는 정수형 변수로 선언된 것이다. (변수라고 하는것은 그 형의 값을 저장하기 위한 공간이라고 생각하면 된다). 보통 윈도우에서는 정수형 변수에 정수를 보관하기 위해 32bit의 공간을 할당한다. (정수는 음수와 양수를 포함한다) 그럼 이 정수형 변수가 가질수 있는 값의 최대값은 얼마일까? 2의 32승 =  4294967296 이다. 그러나 여기서 또 반은 음수로 사용 되고 반은 양수로 사용되기 때문에 약 -2000000000 ~ + 2000000000 까지를 정수형 변수로 표시 할 수 있다. (이 이상의 값을 표시하기 위해서는 좀더 큰 변수형을 쓰거나 다른 방식을 쓴다.)

이것을 2진수로 나타내면

00000000000000000000000000000000 ~ 1111111111111111111111111111111111111111 까지라고 할 수 있다.  그러므로 이 말은 32bit(4바이트)로 총 10자리수(십진수)까지 표시 할 수 있다는 말이다.  

 

그러나 텍스트 파일은 숫자든 문자든 무조건 1자리가 1바이트다 10자리 수를 저장하기 위해서는 10바이트가 필요하다. 1문자를 위해서는 1바이트가 필요하다. 반대로 바이너리 파일은 1자리 수든 10자리 수든 무조건 4바이트가 필요한 것이다.

 

아직도 이해가 안되시는 분을 위해 예를 들어 보겠다. 십진수 127을 바이너리 파일로 저장한다고 쳐보자 (이때 음수형은 표현안한다고 생각하면 이진수 '00000000000000000000000000000000' 이 십진수 '0'이 되고 이진수 '1111111111111111111111111111111111111111' 이 십진수 '4294967296' 가 된다.) 이 숫자를 이진수로 바꾸면 00000000000000000000000011111111(32bit) 이 된다. 이것을 1바이트씩 끊어 보면 00000000 00000000 00000000 11111111 이 된다. 그럼 아스키 코드값을 보기 바란다. 아스키 코드 값의 00000000(십진수 0) 은 NULL 이라고 한다(아무것도 값이 없다는 것을 표시한다). 그리고 11111111(십진수127) 은 DEL 이라고 적혀 있을 것이다. 그래서 이 숫자를 텍스트 파일 형태로 열면 null null null del 값이 나올것이다. (사실 이 null과 del은 컨트롤 문자 이기 때문에 화면에 아무값도 찍히지 않을 것이다.) 대충 이해가 가시는가??

 

텍스트형 파일은 문서파일을 우리가 아무 연산없이 사용하기 편하게 하기 위해 쓰는 파일이다.반대로 바이너리는 컴퓨터가 편리하게 사용하기 위해 사용하는 파일이다. 이처럼 각 파일들은 사용될 곳에 따라 그에 맞는 형식을 저장해야 하는 것이다.


Comments