Node 강의/주특기 플러스

1-2 바이트와 버퍼 객체

kagan-draca 2024. 10. 17. 15:45

 

1. 바이트 배열

8비트 단위의 데이터 배열, 각 요소는 0 ~ 255 사이의 정수 값을 가집니다.(1바이트)

 

8비트  = 1 바이트

128 64 32 16 8 4 2 1
0 또는 1 0 또는 1 0 또는 1 0 또는 1 0 또는 1 0 또는 1 0 또는 1 0 또는 1

 

그래서 경우의 수를 따져 보면

 

 

사이의 값이 들어갈 수 있습니다.

 

그리고 바이트 배열은 45, 65, 6c, 6f 22 ...   형식으로 16진수로 표현 됩니다.

 

16 진수로 표현되는 이유는 컴퓨터의 바이너리 배열은 대부분 16진수로 이뤄지기 때문입니다.

 

2. 바이트  배열 용도

이진 데이터 : 이미지, 데이터, 동영상, 네트워크 패킷 등을 표현할 때 사용됩니다.

효율적인 메모리 사용과 빠른 데이터 전송이 가능합니다.

 

3. Buffer 객체 

Buffer 객체는 Node.js에서 이진 데이터를 다루기 위한 특별한 객체입니다.

JavaScript의 문자열은 UTF-16* 형식으로 인코딩 돼 있어

이진 데이터를 효율적으로 처리하기 어렵습니다.

 

Buffer 객체는 원시적인 이진 데이터를 저장하고 조작하는 데 최적화 돼 있습니다.

 

utf-16) UTF-16은 유니코드 문자를 16비트(2바이트) 단위로 인코딩하는 방식입니다.

 

정리하자면, Byte 배열로 네트워크 패킷을 교환하는데 Byte 배열은 1바이트 기준이고,

JavaScript 문자열은 2 바이트 단위로 저장돼 둘의 바이트 개수가 달라 처리하기 어려운 상황입니다.

 

그렇기 때문에, Buffer 객체에 해당 바이트 배열을 넣어 처리합니다.

 

그래서, JavaScript 안에서는 Buffer 객체가 Byte 배열이고, Byte 배열이 Buffer 객체라 생각하면 됩니다.

 

둘의 차이로는, Buffer 객체는 Byte 배열을 다루기 위한 특별한 객체이기 때문에

지원해주는 메서드들이 존재하는 향후 사용해볼 예정입니다.

 

3. Buffer 객체 장점

 

1. 고정 길이 : 1Byte 배열로 고정 돼 있다.

 

2. 빠른 접근 :  Byte 단위로 빠르게 접근할 수 있다.

 

4. 간단한 Buffer 객체 만들어보기

const buffer = Buffer.from('Hello');

console.log(buffer);

 

버퍼는 Buffer.from()을 사용해 생성할 수 있고,

우리는 'Hello'라는 문자열을 버퍼에 집어넣을 겁니다.

console.log()로 buffer를 출력해보면,

 

Buffer에 48 65 6c 6c 6f가 출력되는걸 볼 수 있습니다.

              H   E  L   L   O

 

입니다. 그럼 Buffer에는 byte 배열이 들어온다고 했기 때문에

index 0번지를 출력해보면,

 

 

72가 출력되는걸 볼 수 있습니다.

 

Buffer 전체에서는 48이 나왔는데 index 0번지에서는 72가 나오는 걸 확인할  수 있습니다.

이유로는, 

 

"Hello"라는 문자열을 바로 바이트 배열로 바꾸는게 아닌 10진수로 바꿔줘야 합니다.

그래서 문자열을 숫자로 표현하기 위한 방법인 ASCII Code 값으로 바꿔줘야 합니다.

그래서, 

 

Buffer 변환 After
"H" 72
문자
H
ASCII Code로 변환 아스키 코드에서 H

 

Buffer 변환 After
72 48
아스키 코드 H 16진수 변환 16진수 H

 

Buffer에서 H는 48인데, Buffer[0]에서 H는 72로 표현 됩니다.

위와 동일하게 "E", "L", "O"도 Buffer[index]로 console을 찍어보면 Buffer 자체를 console로

찍었을 때와 다른 결과가 나타날 것 입니다.