Binary 모드 VS Ascii 모드
아스키모드로 하니까 파일크기가 변하던데?
서버에 있는 160byte파일을 다운로드 했더니 170byte가 됐다. 왜??
->윈도우쪽 TEXT파일에서 라인이 끝나는 문자는 2바이트로 구성(\r\n)
리눅스/유닉스 계열에서 라인이 끝나는 문자는 1바이트로 구성(\n)
ASCII로 파일 전송시 윈도우에서 개행으로 사용하는 \r\n이 리눅스로 업로드 되면서 \n으로 변경
하지만 binary 전송시 아무런 변화없이 \r\n이 포함되어 업로드 됨.
바이너리모드로 파일 전송하거나 다운로드시 파일의 크기가 변하지 않는다.
Windows에서 생성된 txt파일을 binary모드로 리눅스 서버에 전송한다면 파일크키가 변환없이 그대로 저장 되므로 vi로 열었을 경우 ^M이 나타나게 된다.
윈도우에서 작성한 스크립트를 리눅스로 옮겨 실행하고자 하면 명령의 마지막에 ^M가 붙어 파일명이 잘못되거나 하는 등 오류가 생긴다.
흔히 알고있는 개행문자(CR : Carriage Return)에 의한 것인데...\r 이 그 원인이다.
윈도우에서는 엔터시에 한줄을 내리고 커서를 앞으로 보내주지만 즉,엔터 한번으로 두 명령이 입력되는거죠..
하지만 유닉스에서는 엔터치면 단지 줄만 바뀌죠..즉 한번의 엔터는 단지 한번의 명령일 뿐
ASCII모드일 때
UNIX -> PC 일때, 파일크기가 한 줄당 1바이트씩 증가.
PC -> UNIX 일때, 파일크기가 한 줄당 1바이트씩 감소.
BINARY모드일 때
파일 전송할 때 파일크기 변하지 않음.
BUNARY파일을 ASCII모드로 PC와 UNIX사이에서 전송할 때 BINARY파일의 내용은 깨짐.
BINARY모드로 다시 보내야함.
ASCII모드로 파일 전송 시에는 윈도우에서 개행으로 사용하는 \r\n이 리눅스로 업로드 되면서
\n으로 변경됨.
하지만 binary 전송 유형은 아무런 변환 과정 없이 그대로 \r\n이 포함되어 업로드 됨.
결국 리눅스에서의 개행 문자 \n을 제외한 \r은 ^M와 같은 문자열로 표시되어 문제발생.
OS마다 EOL과 EOF 표시하는 코드값이 기종마다 다름.
EOL EOF
Windows 13[CR]+10[LF] 26[^Z]
Linux 10[LF] 04[^D]
1981년에 등장한 MS-DOS는 CP/M의 CR+LF 방식을 따랏다. CP/M은 시리얼 라인으로 터미널을 연결했기 때문에 화면 전환 속도가 느렸다. 느린 터미널에서 줄바꿈이 있을 때 스크롤 하는 시간과 보조를 맞추기 위해 CR+LF 방식을 쓰는 것이 자연스러웠다. 윈도도 이 관례를 따르고 있다.
ASCII 모드
1) 8bit 중 하위 7bit만 사용(1bit는 다른 목적으로 예약)
2) RAM이 비싸던 시절에 대두.
3) 기종간 EOF, EOL 문제로 ASCII 모드를 없애지 못함
Binary모드
1) 8bit 모두 사용(1bit마저 유용한 데이터로 사용하는 프로그램들의 등장 ex)MS워드, 이미지 비디오 등등)
2) 8bit가 모두 유용한 데이터들인데 7bit만 사용하면 결국 1/8 손실이 감수되므로 변환과정이 포함되지 않음.
Window에서 생성된 TXT파일을 Binary모드로 Linux쪽으로 전송한다면 변환없이 그대로 저장되므로, 이 파일을 vi에디터로 열었을 때 ^M이 나타남.
바이너리 전송은 파일에 변화를 주지 않고 있는 그대로 전송하는 것입니다.
그러나, ASCII 전송은 전송할 텍스트 파일에 자동으로 필요한 문자코드를 추가하거나 불필요한 문자코드를 제거하여 파일이 전송될 대상 시스템의 환경에 맞게 텍스트 파일을 수정하여 전송합니다.
그러므로 당연히 파일의 크기가 달라집니다.
물론, 텍스트 내용에는 변화가 없습니다.
이렇게 하는 이유는 사용하는 OS마다 텍스트 파일의 특수기능 문자들의 일부 기능에 차이가 있기 때문입니다.
예를 들면...
윈도우나 도스에서는 텍스트 문서에서 줄바꿈을 표시할때 줄바꿈문자(CR)과 커서초기화문자(LF)를 함께 써야만 하지만,
유닉스나 리눅스 등에서는 줄바꿈문자(CR)만 사용합니다.
ASCII로 전송시 자동으로 이러한 차이를 보정하여 전송이 되지만,
바이너리로 전송하면 그대로 전송되기 때문에, 전송 후 텍스트 편집기로 열어보면
줄이 바뀌는 부분마다 이상한 특수 기호가 나타나는 것을 보실 수 있으실 것입니다.
이것은 시스템이 줄바꿈을 제대로 인식하지 못하기 때문입니다.
캐리지리턴(Carriage return, CR)
문자의 새 줄을 시작하는데 쓰이는 제어 문자나 그 구조를 가리킴.
원래 캐리지 리틴언 타자기의 구조나 레버를 가리키는 용어 였음.
최초의 전기식 캐리지 리턴은 1960년 스미스 코로나가 전기 타자기에 추가.
아스키와 유니코드에서 캐리지 리턴은 13(16진수 0D)으로 정의 되며
Ctrl+M (^M)를 통해서도 볼 수 있음.