Buffer 이해하기 01

Buffer 이해하기 01

2018, Dec 01    

Buffer란?

Buffer란 Node.js 에서 제공하는 Binary 의 데이터를 담을 수 있는 Object 입니다.
바이너리 데이터라는 말 그대로 01001010... 과 같은 데이터가 Buffer 객체에 담긴다는 말 입니다.

문자열을 Buffer로 변환하기

문자 hi 를 예를 들어 보겠습니다.

var buff1 = new Buffer('hi') // deprecated
var buff2 = Buffer.from('hi')
var buff3 = Buffer.from('hi', 'utf-8') // 인코딩 생략가능

// buff1, buff2, buff3 모두 동일
console.log(buff1) // <Buffer 68 69>
console.log(buff2) // <Buffer 68 69>
console.log(buff3) // <Buffer 68 69>

new Buffer()Buffer.from() 2가지의 방법으로 동일한 Buffer 객체를 생성할 수 있지만, new Buffer 의 경우는 deprecated 된 상태이기 때문에 Buffer.from 을 사용하시는 편이 더 바람직 할 것 같습니다.

실제로 버퍼가 메모리에 담고있는 값은 이진수 이지만 콘솔에는 68 69 와 같이 16진수로 표기가 됩니다.

Buffer 의 Default 인코딩 값은 UTF-8 입니다.
때문에 hi 란 문자열은 utf-8 인코딩 값 기준에 따라 바이너리로 변경되었습니다.

h => 16진수 68 => 2진수 01101000
i => 16진수 69 => 2진수 01101001


Buffer 에 담고 있는 2진수를 문자열로 변환하기

앞에서 생성한 buffer 객체를 다시 string 문자열로 변환해 보겠습니다.
간단하게 buffer 객체의 toString() 메소드를 이용해서 변환할 수 있습니다.

buff1.toString() // hi
buff1.toString('utf-8') // hi

Buffer 생성시와 마찬가지로 인코딩 값은 생략할 수 있습니다.
toString() 의 default 인코딩 값은 역시 마찬가지로 utf-8 입니다.

살짝 주제에서 벗어나는 이야기 이지만 아래와 같이 ascii 코드로 디코딩 할 경우도 마찬가지로 같은 값이 출력됩니다.

buff1.toString('ascii') // hi

왜? utf-8 이 ascii 코드의 확장이기 때문입니다. 때문에 ascii 코드가 지원하는 영문 알파벳이나 기본 특수문자 (?!# 등) 들은 ascii 로도 utf-8 으로도 인코딩 디코딩 할 수 있습니다.

한글의 경우는 ascii 코드에서는 지원하지 않기 때문에 ascii 코드로 변경하게 되면 아래와 출력됩니다.

// 한글 '안' 을 utf-8 형식의 바이너리로 변경
var an = Buffer.from('안')
console.log(an) // <Buffer e3 95 88>
// utf-8 타입의 한글의 경우 한글자당 3바이트를 차지합니다.

// buffer to String
an.toString('utf-8') // '안'
an.toString('ascii') // 'l\u0015\b'

한글을 ascii 로 디코딩 할 경우는 왜 ‘l\u0015\b’ 와 같이 표기 될까요?
앞서 말씀 드렸듯이 ascii 코드는 문자 하나당 1바이트로 구성되기 때문입니다.

l 1byte, \u0015 1byte, \b 1byte

ascii 코드는 7바이트 안에서 문자를 구성하고 있기 때문에 7바이트를 넘어가는 문자는 7 바이트를 뺀 나머지 값을 표시합니다.

16 진수 ec => ascii 코드 ‘l’
16 진수 95 => 95 - 7F = 15 => ascii 코드 \u0015 (javascript 의 ascii 코드 값에는 15 값이 없기때문에 그냥 \u0015. C 언어의 경우는 있음)
16 진수 88 => 88 - 7F = 08 => ascii 코드 \b (backspace 의 escape character)