본문 바로가기
개발상식

[개발상식] 인코딩과 binary

by devjh 2021. 8. 16.
반응형

이번게시글에서는 인코딩과 바이너리에 대해 정리합니다.

 

인코딩이란

바이너리를 사람이 이해할수 있는 문자열로 바꾸는 과정을 말합니다.

01000001를 컴퓨터는 문자 'A'로 인식하지만 사람은 인식하지 못합니다.

이를 A로 바꿔주는 작업을 문자 인코딩이라고 합니다.(아스키 인코딩방식을 이용)

 

인코딩의 방식에는 아스키만 있는것은 아닙니다.

010000001010000001010000001010000001010000001

위와같은 숫자가 있을때 아스키 인코딩방식으로는 AAAA이지만 다른 인코딩방식을 사용하면 또 다른 문자가 나오게 됩니다. 

2진수와 16진수

컴퓨터는 반도체소자들의 집합체이며 각 소자들은 전류가 흐르면 1 흐르지 않으면 0을 표현합니다.(2진법사용) 즉 컴퓨터는 0과1을 모든것을 처리해야 하며 파일역시 0과1을 이용하여 저장됩니다.

하나의 0이나 1을 1bit라고 하며 이것이 8개가 모이면 1byte라고 합니다.
1111은 10진수로 15(1+2+4+8)이며 16진수으로 F입니다.
1byte(8bit) 11111111은 10진수로 255(1+2+4+8+16+32+64+128)이며 16진수로 FF(16*15+15)입니다.

1byte의 내용을 확인하기 위해서는 11111111 총 8자리의 2진수를 써야하지만 16진수로는 단 2자리 FF만 사용하면 되므로 보통 16진수 2자리에 1byte를 표현합니다.(16진수는 접두사로 0x를 붙여주는 경우가 많습니다. 0xff)

UNICODE

  • 유니코드는 인코딩방식이 아니라 모든 문자를 2bytes의 숫자로 매핑시키는 방식입니다.(65536개(2^16), 유니코드3.0부터 110만개 이상)
  • 컴퓨터상에서 우리눈에 보이는 모든 문자,특수기호들은 모두 UNICODE에 매핑되어있습니다.
  • 유니코드 여러가지로 표현하는 인코딩 방식이 존재합니다.(ASCII, UTF-8 등)

대표적인 문자 인코딩 종류

  • ASCII
    • 7bit를 사용하여 영어,숫자,특수문자를 표현(2^7이므로 128까지)
    • A는 American의 약자로 영어를 위해 만들어진 문자입니다.
  • ANSI
    • 8bit로 구성되어 256개의 문자를 표현합니다.
    • ANSI = ASCII + CodePage(1bit)
  • UTF-8
    • 유니코드를 위한 가변 길이 문자 인코딩(한글은 3byte 영어는 1byte ASCII는 그대로)
    • ANSI의 단점을 보완한 방식입니다.

txt에디터로 file을 직접 만들어 확인 하기

(1) 1A를 메모장, vi 등 txt에디터에 입력하고 저장합니다.

 

아래의 명령어로 인코딩과 byte를 확인합니다.

$ file -i [filename]
test.txt: text/plain; charset=us-ascii

31는 문자1을 41은 문자A를 나타내는 16진수입니다.
3141이 들어가있습니다(31,41은 1A)
우측에는 ASCII로 디코드 해서 나온 문자들을 보여줍니다.
$ xxd [filename]
00000000: 3141 1A

1byte를 16진수 두자리로 보는게 싫고
2진수로 보고싶다면(8개의 bit를 보고싶다면) -b 옵션을 입력합니다.
$ xxd -b [filename]
00000000: 00110001 01000001 1A

 

(2) 1Aㄱ을 메모장, vi 등 txt 에디터에 입력하고 저장합니다.

  • 한글을 저장하고 확인txt파일에 ㄱ을 추가로 입력하고 저장한후 확인하는 경우
  • charset이 utf-8로 변경되어 있습니다.
  • 툴(메모장, vscode, intellij, atomm 등)이 (유니코드를 utf-8로 자동 인코딩)
$ file -i [filename]
test.txt: text/plain; charset=utf-8

$ xxd [filename]
00000000: 3141 e384 b1 1A...

ASCII 코드는 8byte가 아니라 7byte만 사용합니다.(하나의 비트는 다른 용도로 사용)
따라서 최대숫자는 7F이고 앞자리에 7보다 큰 수(8,9,a,b,c,d,e)가 들어간다면
ascii코드의 인코딩은 깨지게됩니다.


xxd의 명령어로 분석한 파일은 ASCII로 디코딩 된 문자를 보여주는데 ...은 세개의 문자가 꺠진겁니다.
이 바이너리들을 열때는 UTF-8로 열어줘야 한글이 정상적으로 표시됩니다.

반응형

댓글