본문 바로가기

Node.js

[Node.js] 이진 파일 개념 정리

반응형

 

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

https://velog.io/@seeh_h/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%94%94%EC%BD%94%EB%94%A9

 

자바스크립트 문자열의 인코딩 & 디코딩

인코딩, 디코딩, 유니코드, UTF-16, UTF-8, EUC-KR

velog.io

https://velog.io/@longroadhome/%EB%AA%A8%EB%8D%98JS-%EC%8B%AC%ED%99%94-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%99%80-%ED%8C%8C%EC%9D%BC

 

[모던JS: 심화] 바이너리 데이터와 파일

본 포스팅은 여기에 올라온 게시글을 바탕으로 작성되었습니다.파트와 카테고리 동일한 순서로 모든 내용을 소개하는 것이 아닌, 몰랐거나 새로운 내용 위주로 다시 정리하여 개인공부 목적으

velog.io

 

반응형