정보이론

ASCII code(아스키 코드)

성수동이민기 2020. 7. 23. 12:50

 

(같이 보기 : 이진수와 십진수 https://seongsu-minki.tistory.com/14)

 

 아스키 코드를 살펴보기 위해, 먼저 십진수와 이진수에 대해 정리할 필요가 있다. 십진수와 이진수의 변환을 할 수 있어야 아스키 코드를 사용할 수 있기 때문이다. 기억이 나지 않는다면, 링크를 참조하자.

 

 

 아스키 코드는 지금의 미국 국가표준협회(ANSI)의 전신인 미국 표준 협회(ASA)가 주도한 X3위원회가 개발했다고 한다. 1960년 아스키 표준화 작업을 시작하여, 1963년에 표준화 초판을 발간했다.

 

 

 아스키 코드는 문자를 컴퓨터가 이해할 수 있게끔 숫자를 코드화 시켜놓은 것이라고 생각하면 편하다.

 

 나는 지금 한글을 쓰고 있다. 여러분은 스마트폰이나 컴퓨터 모니터를 통해 이 글을 읽고 계실 것이다. 그런데 컴퓨터는 글을 모른다. 0과 1밖에 모른다. 어떻게 이게 가능하지? 사전에 이 코드는 이 글자야 라고 약속했기 때문에 가능하다.

 

 

 아스키 코드는 ASCII(The American Standard Code for Information Interchange)의 약자이다. 아스키 코드에는 알파벳 26개의 대문자, 26개의 소문자 외에도 10개의 숫자, 20여개의 문장부호, 제어문으로 구성되어 있다. 7bits로 되어있는 이 코드에, 각 나라들은 고유의 정보들을 추가해 8bits로 쓰기 시작했다. 그래서 우리나라가 쓰는 ASCII는 8bits다. 이 ASCII는 LZW 알고리즘을 개발하는 데에 중요한 역할을 한다.

 

 아스키 코드를 사용하면, 우리가 사용하는 대부분의 문자를 8bits로 표현할 수 있다. 우리는 0과 1로 이루어진 bit라는 단위로 정보를 표현하고, 저장하며, 전송한다. 이 0과 1이란 신호를 어떻게 문자로 표현할 것인가? 표현하는 방법을 ASCII code로 약속하였다 라고 생각해도 괜찮다. 

 

 8bits는 $2^8 = 256$가지의 문자를 표현할 수 있다. 한 bit는 0아니면 1로, 두 가지 경우의 수를 가지고 있다. 8bits는 이 두 가지 경우의 수를 8개 가지고 있으므로, 2를 8번 곱한 $2^8 = 256$가지의 문자를 표현할 수 있게 된다.

 

 8bits가 256가지의 문자를 표현할 수 있는 것은 알겠다. 각 코드에 어떻게 숫자를 할당해줄까? 여러 방법이 있지만, 대표적이고 직관적인 방법을 소개하고자 한다.

 

 

순서 7 6 5 4 3 2 1 0
할당 숫자 $2^7$=128 $2^6$=64 $2^5$=32 $2^4$=16 $2^3$=8 $2^2$=4 $2^1$=2 $2^0$=1
누적합 255 127 63 31 15 7 3 1
누적합을 다르게 표현 256-1 128-1 64-1 32-1 16-1 8-1 4-1 2-1

 

 위의 표는 일단 참고로 하자. 

 

 00000010이란 8bits짜리 신호와, 00000001이란 신호가 주어져있을 때, 어떤 숫자를 할당할 것인지 고민해보자. 

 

 내 마음대로 00000010에는 20, 00000001에는 302과 같은 숫자를 할당하는 것도 물론 괜찮다. 그러나, 나중에 bit를 숫자로, 혹은 문자로 해석할 때 불편한 점이 없이 자연스럽게 해석이 되는 것이 좋고, 내가 아닌 다른 사람도 8bits의 신호만 보고도 공감할 수 있는 숫자를 할당하는 편이 좋을 것이다. 그래서 사람들은, bit의 순서에 맞게 2의 제곱승을 해준 뒤, 이 값을 누적해서 더하여 숫자를 표현하는 방법을 발견하였다. (위에서 순서는 0부터 시작하는데, c와 같은 프로그래밍에서 배열의 첫 시작은 0으로 시작하는 것을 연상하면 쉬울 것 같다. 이것이 불편하다면 1부터 시작해도 상관없다.)

 

 00000000은 0으로 표현하는 편이 직관적이고 자연스러울 것이다. 그렇다면 00000001은 어떻게 표현할까? 1로 표현하자. 그럼 00000010은? 음.. 처음 보는 숫자니까 2로 표현하자. 위와 같이 숫자를 셀 줄 아는 사람이라면 자연스럽게 연상할 수 있는 방법을 사용하는 것이다.

 

 00000001에서, 1은 $2^0 = 1$이므로, 다음과 같이 표현할 수 있다.

 0*$2^7$ + 0*$2^6$ + 0*$2^5$ + 0*$2^4$ + 0*$2^3$ + 0*$2^2$ + 0*$2^1$ + 1*$2^0$  = 1

 

비슷하게, 00000010은 다음과 같이 표현할 수 있다.

 0*$2^7$ + 0*$2^6$ + 0*$2^5$ + 0*$2^4$ + 0*$2^3$ + 0*$2^2$ + 1*$2^1$ + 0*$2^0$  = 2

 

 위와 같은 방법으로 쭉 표현해나가면, 중복되는 숫자 없이 효율적으로 bit를 숫자로 표현해낼 수 있다.

 

 이 뿐만 아니라, 숫자에서 bit로 변환하는 것도 고민 없이 가능해진다.

 

2를 8bits로 표현하면?

2 = 0*$2^7$ + 0*$2^6$ + 0*$2^5$ + 0*$2^4$ + 0*$2^3$ + 0*$2^2$ + 1*$2^1$ + 0*$2^0$ 

 

1을 8bits로 표현하면?

1 = 0*$2^7$ + 0*$2^6$ + 0*$2^5$ + 0*$2^4$ + 0*$2^3$ + 0*$2^2$ + 0*$2^1$ + 1*$2^0$

 

 

이런 과정을 처음 보는 사람이라면, 다소 어렵게 느껴질 수도 있겠다. 예제를 생각해보며 익숙해져보자.

 

 

예제) 65를 8bits로 표현해보세요.

 

풀이) 풀이를 위해, 먼저 65보다 작거나 같은 2의 배수를 생각해본다. 2를 계속 곱해주면 된다.

 

1, 2, 4, 8, 16, 32, 64, 128...

 

128은 65보다 크다. 따라서, 64가 적절하다.

 

$2^6=64$이므로,  오른쪽에서 7번째(왼쪽에서 2번째) bits에 1을 넣으면, 64를 표현할 수 있다.

 

01000000 = 64

 

우리가 처음에 표현하려 했던 숫자는 65이므로,

65-64 = 1에서, 1만 bit로 표현하면 된다.

 

$2^0=1$이므로, 00000001을 표현해주면 된다.

 

65 = ?

 

+64 = 01000000

+01 = 00000001

--------------------

+65 = 01000001

 

 

예제) 01100001을 숫자로 표현해보세요.

 

풀이) 각 bits에는 0과 1이 할당되어 있다. 0은 무시한 채(0*$2^n$=0이므로), 1에 할당된 2의 제곱수 숫자가 무엇일지 생각해본 뒤, 이 숫자들을 다 더해주면 된다.

 

1*$2^6$ + 1*$2^5$ + 1*$2^0$ = 64 + 32 + 1 = 97

 

 

 

아스키 코드는 위에서 설명한 방식으로 숫자와 bit 사이를 넘나들며 정보를 전달해주고 있다. 각 숫자/bit에 맞는 문자를 할당하여 통신하거나, 자료를 저장한다.

 

 

 

아스키 코드의 장점)

아래 그림에서 볼 수 있는 모든 알파벳을 8bits로 표현할 수 있다.

 

 

단점)

표현/전달하고자 하는 정보의 개수가 적을때, 낭비일 수 있다.

 

예를 들어 어떤 학생의 학점(A, B, C, D, F) 정보를 저장하거나 송수신할 때, 사실 3bits만 있으면 충분하다.

3bits로는 8($2^3$)가지의 상태를 표현할 수 있는데, 학생의 학점 정보는 5가지의 상태밖에 없다.

따라서 3bits만 있으면 되는데 8bits나 차지하고 있으므로, 낭비라고 볼 수 있다.

 

 

참고) ASCII Code 표(~79까지) 1

 

 

참고) ASCII Code 표 2

이미지 출처 : http://www.ktword.co.kr/abbr_view.php?m_temp1=12

이미지 출처 : http://www.ktword.co.kr/abbr_view.php?m_temp1=12

 

 

위의 두 표 중 마음에 드는 표를 살펴보면 좋을 것이다. 위의 그림인 ASCII Code 표 1은 79까지만 표현되어있다.

 

ASCII Code 표 2의 노란색 배경 글자들은 전송 제어 문자, 장치 제어 문자와 같은 제어 문자로, 관심이 있다면 찾아보도록 하자.

 

표 읽는 법 - 위에 써 있는 숫자 + 옆에 써있는 숫자

 

ex) A의 아스키 코드에 해당하는 숫자는?

64+1 = 65

 

ex) 표에서 Z에 해당하는 숫자는?

80+10 = 90

 

ex) 97에 해당하는 아스키 코드의 문자는?

a (96+1 = 97)