Buffer
바이너리 데이터들의 스트림을 읽거나, 조작하는 매커니즘.
Buffer클래스는 바이너리 데이터들의 스트림을 직접 다루기 위해 Node.js API에 추가됨
- ArrayBuffer
자바스크립트에서 모든 이진 데이터는 기본적으로 모두 ArrayBuffer 객체에 포함된다.
ArrayBuffer는 그저 메모리의 연속된 공간을 차지하고 있는 추상적인 메모리 계층과도 같다.
ArrayBuffer에 대한 접근 및 조작은 항상 view라고 불리는 객체를 생성해서 수행해야 한다.
view 객체는 자기 스스로는 어떠한 데이터도 저장하고 있지 않고, 그저 ArrayBuffer의 내부를 들여다보기 위한 수단으로 사용한다.
- TypedArray
view 객체 == TypedArray (Uint8Array, Uint16Array)
new TypedArray(buffer, [byteOffset], [length]);
new TypedArray(object);
new TypedArray(typedArray);
new TypedArray(length);
new TypedArray();
메소드
- arr.buffer : ArrayBuffer에 대한 참조
- arr.byteLength : ArrayBuffer의 바이트 크기
- DataView
DataView는 조금 더 유연하게 ArrayBuffer에 접근할 수 있는 view 객체다.
new DataView(buffer, [byteOffest], [byteLength]);
Character Encoding (문자인코딩)
문자를 숫자로 나타내는 것에 규칙이 있는 것 처럼, 숫자를 바이너리 데이터로 나타내는 데에도 규칙이 있다.
Character Encoding은 숫자를 몇 bit로 나타낼 것인가임.
- UTF-8
숫자를 8개 비트의 집합으로 표현한 것이다.
ex) 12 == 0000 1100
- UTF-16
숫자를 16개 비트의 집합으로 표현한 것이다.
ex) 12 == 0000 0000 0000 1100
문자(L) -> 숫자(76) -> 이진수 (0010 0110)
- TextEncoder, TextDecoder
자바스크립트 네이티브 객체로서 인코딩과 디코딩을 도와준다.
utf-8의 byteArray로의 변환만을 지원한다.
TextEncoder : 한글 -> 이진수
TextDecoder : 이진수 -> 한글
let decoder = new TextDecoder([label], [options]);
- label : 인코딩 방식을 지정하며, 기본적으로 utf-8을 가장 많이 사용하지만 big5, windows-1251 등의 인코딩 방식도 지원된다.
- options : 선택 항목으로 다음 설정값이 있다.
- fatal : boolean 값으로 true인 경우 디코딩이 불가능한 잘못된 글자를 대상으로 예외를 던진다. false라면 예외는 던지지 않고, 해당 문자를 \uFFFD로 대체한다.
- ignoreBOM : boolean 값으로 true인 경우 사용되지 않는 바이트 순서 표식(Byte Order Mark, BOM)을 무시한다.
let str = decoder.decode([input], [options]);
- input : 디코딩 할 BufferSource
- options : 선택 항목
- stream : 많은 양의 데이터를 받아들여 decoder를 반복적으로 호출할 때도 디코딩이 반복적으로 실행된다. 이런 경우에 멀티 바이트 문자가 많은 데이터로 분할될 수 있다. 해당 옵션은 데이터 분할을 방지하기 위해 TextDecoder에 "unfinished"문자를 입력시키고 다음 데이터가 오면 디코딩하도록 지시한다.
let encoder = new TextEncoder();
TextEncoder는 인코딩 시 오직 utf-8만 지원한다. 이때 다음 2가지 메서드가 있다.
- encode(str) : Uint8Array에 문자열을 이진 데이터로 변환하여 반환
- encodeInto(str, desination) : Uint8Array 구조 형태로 문자열 str을 destination에 인코딩하여 반환
let encoder = new TextEncoder();
let uint8Array = encoder.encode('Hello');
console.log(uint8Array); // 72,101,108,108,111
Stream
Node.js 에서의 스트림은 간단하게 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미한다. 전체적인 의미로는, 만약 우리가 어떤 방대한 양의 데이터를 처리해야 할때, 모든 데이터가 전부다 사용가능 할때까지 기다리지 않아도 된다는 것이다.
한 작업이 데이터를 처리하는 시간보다 데이터가 도착하는 게 더 빠르다면, 초과된 데이터는 어디에선가 처리되기를 기다리고 있어야 하는데, 이 기다리는 영역이 buffer다.
큰 데이터는 청크단위로 세분화되어 전송된다.
출처
https://tk-one.github.io/2018/08/28/nodejs-buffer/
Node.js의 Buffer를 제대로 이해해보자
이 글은 Daajust의 Do you want a better understanding of Buffer in Node.js? Check this out. 글을 번역 한 글입니다. 모든 저작권과 권리는 Daajust에게 있습니다. 곳곳에 의역이 들어가있는 점 양해부탁 드립니다 :) No
tk-one.github.io
자바스크립트 문자열의 인코딩 & 디코딩
인코딩, 디코딩, 유니코드, UTF-16, UTF-8, EUC-KR
velog.io
[모던JS: 심화] 바이너리 데이터와 파일
본 포스팅은 여기에 올라온 게시글을 바탕으로 작성되었습니다.파트와 카테고리 동일한 순서로 모든 내용을 소개하는 것이 아닌, 몰랐거나 새로운 내용 위주로 다시 정리하여 개인공부 목적으
velog.io