비트와 바이트

컴퓨터는 정보를 표현하기 위해 전기 신호를 주고받으며 의사소통을 한다.
전기 신호가 있으면 1, 없으면 0, 이때 0 혹은 1의 값이 데이터의 최소 단위가 되고 이를 비트(bit) 라고 표현한다.
따라서 컴퓨터에 저장된 데이터는 0 혹은 1 2진수로 표현되는 것이다.
하지만 이 비트(bit)만 가지고서는 2가지 밖에 표현하지 못하기 때문에 다른 저장 단위가 필요하게 된다.

그래서 연속된 8bit를 묶어 더 많은 값을 표현할 수 있는 바이트(byte)가 등장하게 된다.
1byte는 컴퓨터의 최소 저장 단위로서8bit를 의미한다. 00101100과 같은 방식으로 총 2^8가지 즉 256가지의 정보를 표현 가능하다.

 

아스키코드 (ASCII)

아스키코드는 우리가 사용하는 인간의 언어와 컴퓨터가 사용하는 언어를 매칭시킨 규칙이라고 할 수 있다. 예를 들어 A1000001 B1000010 과 같이 표현하겠다고 약속한 것이다. 이때 아스키코드는 1바이트의 데이터로 표현 가능하다.

img

그런데 표를 자세히 보면 1바이트 즉 8비트로 표현되는 것이 아니라 7비트만 사용되는 것처럼 보인다.
이는 패리티 비트라는 것 때문인데, 간단히 말하면 데이터의 에러를 감지하기 위해 사용되는 비트이다. (링크 : 패리티 비트란 무엇인가)

결국 이를 제외하면 아스키코드는 7비트로 표현가능하기 때문에 총 2^7개인 128개의 문자를 표현할 수 있다.
하지만 128가지로 영어는 모두 표현 가능 했지만, 전 세계의 다양한 문자를 표현하기는 부족했다.

 

EUC (Extended Unix code)

멀티 바이트를 사용해 한, 중, 일 등의 다양한 언어를 표현하기 위한 인코딩 방식이다.
EUC-KR, EUC-JP, EUC-CN 등 다양한 언어를 표현하기 위해 사용되었지만 한계가 있었다.

EUC-KR로 인코딩한 페이지에 한국어와 일본어가 동시에 있다면? 일본어가 깨져버린다. 반대도 마찬가지.
또한 이모티콘도 표현할 수 없었기 때문에 다른 대안이 필요했다.

 

유니코드

따라서 전 세계 언어의 문자를 정의하기 위한 국제 표준인 유니코드가 등장하게 되었다. (현재까지 약 14만개 문자, 약 2^18비트 필요)

그러나 유니코드 또한 단점이 있는데, 모든 문자를 표현할 수 있지만 메모리 낭비가 너무 심했다. 간단한 문자를 표현하는데도 4바이트씩 필요하게 된 것이다.

간단한 영어는 아스키코드를 사용해 효율적으로 읽고, 다른 언어는 유니코드로 사용하고 싶어서 등장한 것이 대표적으로 UTF-8등의 인코딩 방식들이다.

 

UTF-8 (8-bit Unicode Transformation Format)

다양한 유니코드 인코딩 방식 중 우리에게 익숙한 UTF-8 방식을 살펴보자.
UTF-8은 이름에서도 알 수 있듯이 문자열 집합과 인코딩 형태를 8bit 단위로 한다는 의미를 가지고 있다.

메모리를 효율적으로 사용하기 위해서 문자 하나당 1byte ~ 4byte까지 사용한다.


그렇다면 어떤 문자를 어떤 바이트로 읽을지 어떻게 알 수 있을까?

그것은 첫번째 바이트를 보고 판단할 수 있다.

바이트 수 첫번째 바이트 두번째 바이트 세번째 바이트 네번째 바이트
1 0xxxxxxx - - -
2 110xxxxx 10xxxxxx - -
3 1110xxxx 10xxxxxx 10xxxxxx -
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

위 표에 xxx 부분이 실제 문자를 나타내기 위한 비트값이 들어가는 부분이다. 예시를 보자면 다음과 같은 형태로 문자를 읽어들이는 것이다.

 

문자 유니코드 코드 포인트 UTF-8 바이트
A U+0041 (0000 0000 0100 0001) 01000001 (0x41) 1btye
U+AC41 (1010 1100 0100 0001) 11101010 10110001 10000001 (0xEA 0xB1 0x81) 3byte


아스키 코드와도 완벽히 호환되고 UTF-16, UTF-32에서 발생하는 엔디언 문제도 없기 때문에 현재 모든 웹페이지의 93%가 UTF-8을 사용하고 있다.

 

엔디안 문제 : 1바이트를 초과하는 데이터를 저장할 때 메모리에 어떤 순서로 저장할 것이냐

'개발자의 기본기 > 컴퓨터 기초' 카테고리의 다른 글

패리티 비트(parity bit)  (0) 2021.08.10

패리티 비트(parity bit)란 정보의 전달 과정에서 오류 발생 여부를 검사하기 위해 추가된 비트이다. 전송하고자 하는 데이터의 끝에 1비트를 더하여 송수신 하는 방식으로 사용한다.

패리티 비트의 종류는 전송하고자 하는 데이터에 포함된 1의 개수에 따라서 짝수 패리티와 홀수 패리티, 2가지가 있다.


예를 들어 ASCII코드 A 를 나타내는 1000001 을 전송하고자 할 때,

홀수 패리티를 사용한다면 1000001 + 1 (1의 개수가 총 3개로 홀수를 맞춰 준다)

짝수 패리티를 사용한다면 1000001 + 0 (1의 개수가 총 2개로 짝수를 맞춰 준다)


송신 호스트는 다음과 같은 방식으로 데이터를 전송한다. 이때 수신 호스트도 7비트까지의 데이터를 보고 패리티 검사 방식(짝수, 홀수)에 따라 패리티 비트를 계산한 결과와 실제 받은 데이터 값을 비교하고 값이 같다면 오류가 없다고 판단하고, 값이 다르다면 오류가 있다고 판단하는 방식이다. 이렇게 오류가 있는 데이터를 받았을 경우에는 송신 측에 다시 데이터를 요청하는 방식으로 안정적인 통신을 할 수 있게 해주는 장치이다.

패리티 비트의 한계점

하지만 패리티 비트는 오류를 검사만 할 수 있을 뿐, 수정하지 못한다는 한계점을 가지고 있다. 그리고 만약 두 개의 비트가 오류 전송 될 경우 데이터는 서로 다르지만 같은 패리티 비트를 가지기 때문에 이 때는 오류를 제대로 검사할 수 없다. 즉 오류 비트가 홀수 개일 경우에만 오류를 검사할 수 있다는 한계점이 있다.

병렬 패리티

이런 한계점을 보완하기 위해 패리티를 가로 세로로 구성되는 데이터 블록에 적용하여 에러 위치를 찾아 정정할 수 있도록 만든 것이 병렬 패리티이다.

병렬 패리티는 아래 표에서와 같이 각각의 가로 1바이트에 대해 패리티를 만들고 각각의 세로 1바이트에 대해 패리티를 구성하여 블록 단위로 전송하면 가로와 세로에 대해 각각 패리티를 검사함으로써 에러를 찾아내고 정정할 수 있다.

전송된 데이터 블록 중에서 한 비트의 에러가 발생하면 가로와 세로 패리티의 특정 부분에 패리티가 맞지 않게 되며 아래 표에서와 같이 두 부분이 마주치는 곳에서 에러가 발생함을 알 수 있음에 따라 이를 정정할 수 있다.

참고문헌: '디지털 논리회로 이해', 오창환 저, 한국학술정보(주)

참고문헌: '디지털 논리회로 이해', 오창환 저, 한국학술정보(주)

+ Recent posts