Will find a way
버퍼 (Buffer) / 스트림 (Stream) 본문
목차
1. 버퍼객체
2. 문자 집합
2 - 1 아스키 코드 (ASCII)
2 - 2 유니코드 (Unicode)
2 - 3 인코딩 규칙
3. 스트림과 버퍼
1. Buffer 객체
NodeJs의 내장 객체
Buffer 공식문서
바이너리 데이터의 스트림을 읽거나 조작하는 메커니즘 octet 스트림(일반적으로 8bit 형식으로 된 데이터를 의미) 과의 상호작용을 가능하게 하기 위해 만들어졌다.
Buffer 클래스는 Binary Data 들의 스트림을 직접 다루기 위해 NodeJs API에 추가된 것
Binary Data
2진수 참고 자료
https://jakapark.tistory.com/38
2진수와 비트 / 16진수
목차1. 비트(bit)란?2. 2진수3. 16진수 1. 비트(bit)란?비트는 컴퓨터에서 데이터를 표현하는 가장 작은 단위다. "비트"라는 용어는 "binary digit(2진 숫자)"의 줄임말로, 0 또는 1의 두 가지 값중 하나를
jakapark.tistory.com
- 숫자를 표현하기는 쉽지만 글자를 표현하기 어렵다. 만약 A를 65, a를 97의 값으로 인식한다.
- 이는 사람이 정해준 것이며 이러한 것들을, "문자 집합"이라고 한다.
(문자 집합 : 문자를 숫자로 표현할 수 있도록 정의한 규칙)
2. Character Set (문자 집합)
Character Set은 각각 문자를 숫자로 나타낼 수 있도록 정의해놓은 규칙이다. Character Set만 있지는 않고 여러가지 Set들이 있다. 이중에서 가장 유명한 것이 유니코드와 아스키코드이다
2-1 아스키 코드 (ASCII CODE)
- 글자를 표현할 때 8bit만 사용한다. (= 1byte)
- 8bit 중에서 1bit는 오류 체크용도로 사용하고 실제 사용은 7bit 만 사용한다.
- 00000000 ~ 11111111 즉 2^7 = 128까지 아스키코드는 128가지의 글자를 표현할 수 있다.
- 한글을 제외한 키보드 자판에 있는 영어와 특수문자만 표현이 가능하다.
- 한글은 1byte로 표현이 불가능하다. (알파벳 1글자 한글 1글자는 크기가 다름)
- 그래서 생긴 것이 유니코드 (한글과 같은 다른 문자를 표현하기 위함)
2-2 유니코드 ( Unicode )
- 유니코드는 전세계의 문자를 일관되게 표현 할 수 있도록 설계된 표준
- 아스키 코드와 유니코드의 큰 차이점은 용량의 차이
- 글자 하나당 1byte가 아닌 2byte를 사용
2-3 인코딩 규칙
문자를 숫자로 나타내는 것의 규칙이 있는 것처럼 숫자를 바이너리 데이터로 나타나는 데에도 규칙이 있다. A는 숫자 65를 나타내는데 A12 컴퓨터가 2진수로 표현하면 1000 0011100 이렇게 변환을 한다. 컴퓨터는 어디서 잘라야할지 몇글자를 잘라야할지 모르고 어떻게 자르냐에 따라 결과물이 달라질 수 있다. 앞 8bit 뒤를 4bit로 잘라야 A12 를 만들 수 있다. 그래서 우리는 '문자 인코딩'을 한다. 문자 인코딩 중 하나인 UTF8에서 8은 8bit 를 의미한다. 하지만 12라는 숫자는 4bit로 표현이 가능하지만 문자 인코딩을 통해서 8bit로 변환해야한다. 4자리의 숫자를 8자리의 숫자로 표현해주면 된다
ex) 0000 + 1100 / 자리수만 채우는 형태. 12라는 숫자는 문자 인코딩을 통해 00001100 으로 표
3. 스트림(Stream)과 버퍼(Buffer)
Stream (스트림)
NodeJs의 스트림은 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미한다. 전체적인 의미로는 방대한 데이터 처리를 할 때 모든 데이터가 전부 다 사용가능할 때까지 기다리지 않아도 된다는 것이다. 기본적으로 큰 데이터는 청크 단위로 세분화 되어 전송한다. 이 말은 Buffer의 정의에 따르면 파일 시스템에서 바이너리 데이터들이 이동하는 것을 의미한다. 예를 들어, file1.txt의 텍스트를 file2.txt로 옮기는 것을 의미한다.
Buffer (버퍼)
데이터 스트림이란 일련의 데이터들이 한 지점에서 다른 지점으로 이동하는 것이다. 그럼 데이터가 어떻게 이동되는 것일까? 일반적으로 데이터 이동은 그 데이터를 가지고 작업 혹은 읽기 등을 하기위해서 일어난다. 하지만 어떤 작업을 할 때 특정 시간동안 데이터를 받을 수 있는 데이터의 최소량과 최대량이 존재한다. 그래서 데이터를 처리하는 시간보다 데이터가 도착하는게 더 빠르다면 어떻게 될까? 초과된 데이터는 어느 공간에서 처리되기를 대기하고 있어야한다. 데이터를 처리하는 시간보다 훨씬 빠르게 계속해서 새로운 데이터가 도착하면 어딘가에는 도착한 데이터들이 쌓일 것이기 때문이다.
반면에, 한 작업이 데이터를 처리하는 시간이 데이터가 도착하는 시간보다 더 빠르다면, 먼저 도착한 데이터는 처리되기 전에 어느 정도의 데이터량이 쌓일 때까지 기다려야한다.
그 데이터가 대기하는 영역이 Buffer다.
컴퓨터에서 일반적으로 RAM의 영역에서 streaming중에 데이터가 일시적으로, 기다리다가 데이터를 처리할 때 처리하기 위해서 내보내준다. nodejs는 데이터가 도착하는 시간이나 전송되는 속도를 제어 할 수 없다. nodejs가 결정할 수 있는 것은 언제 데이터를 보낼건지의 여부다.
아직 데이터를 내보낼 때가 아니면 nodejs는 데이터들의 대기 영역인 RAM에 작은 영역인 buffer에 데이터를 쌓아 놓는다.
ex) 유튜브 등의 영상을 볼 때 인터넷이 좋으면 버퍼를 빠르게 채우고 데이터를 빠르게 내보내서 처리하는 것을 반복한다. 반대로 인터넷이 좋지 않으면 로딩을 띄우면서 버퍼링이 걸리고 뎅터가 더 도착할 때까지 기다린다는 의미 데이터가 더 싸이고 처리되면 영상이 다시 재생된다.
Buffer 객체
NodeJs에서는 Streaming을 하는 동안 자동으로 buffer를 만든다.
Buffer 다루기
const buf = Buffer.alloc(10) // size가 10인 버퍼 객체를 만든다. (10 byte)
const buf2 = Buffer.from("hello Buffer") // Buffer 객체의 데이터를 담아준다.
// 버퍼 내용을 확인해준다
console.log(buf.toJSON())
console.log(buf2.toJSON())
buf.write("Hellow Buffer") // 빈공간의 버퍼에 내용을 넣어줌
// 버퍼를 디코딩
console.log(buf.toString())
let a = "A";
let b = 12;
// charaCodeAt 아스키 코드로 변환
// 매개변수는 인덱스 문자의 위치
// toString(2) == 이진수 문자열로 변환 매개변수로 전달한 값이 진수
// utf8 == 8bit 00000000
// padStart() 문자열의 크기에서 남은 공간을 다 전달한 매개변수 문자열로 채워준다
// 매개변수 크기, 문자열
a = a.charCodeAt(0).toString(2).padStart(8, "0"); // 01000001
b = b.toString(2).padStart(8, "0") // 00001100
c = a + b;
const binaryToString = (str) => {
let temp = "";
for (let i = 0; i < str.length; i += 8) {
// 2진수를 정수로 변환
const strTemp = parseInt(str.substr(i, 8), 2);
// fromCharCode 아스키 코드를 문자열로 변환
if (String.fromCharCode(strTemp) == false) {
temp += strTemp;
}
temp += String.fromCharCode(strTemp)
}
return temp;
}
const res = binaryToString(c);
console.log(res);
'BackEnd > NodeJs' 카테고리의 다른 글
3-way-handshake 코드 구현 (0) | 2024.06.18 |
---|---|
스트림(Stream) 사용 예제 (0) | 2024.06.12 |
TCP 서버 간단하게 구현하기 (0) | 2024.06.10 |
[NodeJs] 모듈, require, module.exports와 exports (0) | 2024.06.05 |
[NodeJs] REPL 모드 (0) | 2024.06.04 |