본문 바로가기
TIL&WIL

250103 TIL - Buffer 메서드

by 나노다 2025. 1. 3.

Buffer 객체 메서드 모음

1) Buffer.alloc()

새로운 Buffer 객체를 생성해주는 메서드!! Buffer의 크기는 필수로 지정해줘야한다!!

기본 구조

Buffer.alloc(size[, fill[, encoding]])
  • size : 새로 만들 Buffer의 크기, size가 5 라면 5 바이트의 Buffer 생성
    • 숫자 타입만 가능!!
  • fill : 새 Buffer를 미리 채울 값, 기본값은 0
    • 숫자 타입인 경우, 매 바이트에 해당 숫자가 채워짐
    • 0 ~ 255 사이의 정수만 가능, 만약 256 이상이라면 그 값을 256으로 나눈 나머지가 채워짐
    • 그 외에 문자열, 다른 Buffer 객체, Uint8Array를 채울 수 있음
    • 얘네의 길이가 size 보다 작은 경우, 반복해서 채워짐 (아래 예시에서 확인해보자!!)
    • 반대로 size보다 크다면, 앞에서부터 size 만큼만 채워진다!! (아래 예시에서 확인해보자!!)
  • encoding : fill이 문자열일 때 필요, 그 문자열을 인코딩하는 방식 지정, 기본값은 "utf8"
Uint8Array
모든 요소가 8비트 크기의 Uint 타입 정수인 배열, 자바스크립트의 TypedArray 중 하나!
8비트 크기의 Uint 타입은 0에서 255 사이의 정수란 소리고!!
TypedArray는 컨셉 있는 배열이란 소리다!!
음수는 저장할 수 없는 배열이며, 만약 256 이상의 값이라면 그 넘을 256으로 나눈 나머지로 변환됨!!

alloc 예시

/* fill의 기본값은 0 */
Buffer.alloc(5); // 출력 : <Buffer 00 00 00 00 00>

/* 문자열 fill */
Buffer.alloc(5, "abc"); // 출력 : <Buffer 61 62 63 61 62>
// 문자열 길이가 size보다 작기 때문에 반복해서 채우다가 다 차면 그만 채움
// 5바이트를 a -> b -> c -> a -> b 순으로 채운 겨!!
Buffer.alloc(3, "abcde"); // 출력 : <Buffer 61 62 63>
// 문자열 길이가 size보다 크기 때문에 들어갈 수 있을 만큼만 채움
// 3바이트를 a -> b -> c 순으로 채우고 d, e는 버린 겨!!

/* 다른 Buffer 객체 */
const otherBuffer = Buffer.from([1, 2, 3]);
Buffer.alloc(5, otherBuffer); // 출력 : <Buffer 01 02 03 01 02>
// 문자열과 마찬가지로 반복해서 채우다가 다 차면 그만 채움

/* Uint8Array */
const array = new Uint8Array([4, 5, 6]);
Buffer.alloc(5, array); // 출력 : <Buffer 04 05 06 04 05>
// 이하동문

2-1) writeUInt32BE()

Buffer 객체의 요소들을 새로 써준다!! 쌍둥이 형제들이 굉장히 많지만, 대표로 이 녀석을 알아보자!!
먼저 write는 메서드의 기능, UInt는 입력할 데이터의 타입,

32는 입력될 데이터가 차지할 비트 수, BE는 메모리 저장 방식 중 Big Endian 유형을 택하겠단 의미다!!

참고로 32비트는 4바이트니까, Buffer에서 네 칸을 새로 쓰겠단 의미겠지?!

그리구 이 네 개가 이리저리 바뀌면서 다양한 조합의 메서드가 있을 수 있겄지요? 다 쌍둥이임!!

기본 구조

buf.writeUInt32BE(value[, offset])
  • value : Buffer에 입력될 데이터!! 만약 메서드에서 요구하는 자료형이 아닌 경우, 자동 변환되거나 오류 발생
    • 부호가 다른 정도는 변환해서 투입하는데, 정수의 범위나 자료 타입 자체가 맞지 않으면 오류!!
  • offset : 쓰기를 시작할 인덱스, 기본값은 0임!! 만약 출발했는데 남은 바이트가 메서드의 요구보다 적다면 오류 발생!!

2-2) readUInt32BE()

Buffer 객체에서 원하는 요소들을 읽어온다!! 역시 쌍둥이 형제가 많고, 설명도 위 메서드와 이하동문!!

기본 구조

buf.readUInt32BE([offset])
  • offset : 읽기를 시작할 인덱스, 기본값은 0임!! 만약 출발했는데 남은 바이트가 메서드의 요구보다 적다면 오류 발생!!

3) Buffer.from()

어떤 데이터를 Buffer 객체로 변환해준다!!

기본 구조

Buffer.from(data[, encoding])
  • data : 변환할 데이터, 대개 문자열이나 배열 타입이 들어감!!
    • 여기에 다른 Buffer 객체를 넣어 Buffer를 복사하는 방식으로도 활용 가능!!
  • encoding : data가 문자열일 때, 변환 방식을 지정
    • 주로 'utf8', 'ascii', 'base64', 'hex', 'latin1' 정도 사용한다!!

4) Buffer.compare()

두 개의 Buffer 객체를 인자로 받아 순서를 비교하고, 그 결과를 -1, 0, 1 중에 반환한다!!

순서 비교는 우선적으로 두 녀석의 바이트 size를 비교하고, 작은 쪽을 작다고 판단!!
만약 size가 동일하다면, 객체의 요소들을 16진수 값으로 변환해 크기 비교!! (문자열이면 ASCII 코드 거쳐서 변환)

기본 구조

Buffer.compare(buf01, buf02);
  • 반환값 : 둘의 크기가 같다면 0, 앞에 놈이 작으면 -1, 앞에 놈이 크면 1

어딘가 익숙한 반환값이라 생각이 들면 빙고, 뭔가 sort() 메서드가 떠오르지 않나요?

compare()는 Buffer 객체로 이루어진 배열을 정렬할 때 활용하기 좋다!!


5) Buffer.concat()

여러 Buffer 객체들을 하나의 Buffer로 병합해주는 메서드!! Buffer들을 배열에 담아 넣어보자!!

기본 구조

Buffer.concat(list[, totalLength])
  • list : 합칠 Buffer들이 담긴 배열
  • totalLength : 합쳐진 새 Buffer의 바이트 개수
    • 따로 지정하지 않는다면 합칠 녀석들의 길이를 전부 합산한 값
    • 혹시 전부 합산한 값이 totalLength보다 크다면, 넘치는 요소들을 버려짐
    • 반대로 작다면, 남는 바이트는 0으로 채워짐

concat 예시

/* totalLength 제한에 걸리는 경우 */
const buf1 = Buffer.from("Hi, ");
const buf2 = Buffer.from("world!");
const result = Buffer.concat([buf1, buf2], 5);
console.log(result.toString()); // 출력: "Hello"
// 총 10바이트가 필요하지만 5로 제한이 걸려 앞에서부터 채우고 나머진 자름

/* totalLength가 남는 경우 */
const buf1 = Buffer.from("ab"); // <Buffer 61 62>
const buf2 = Buffer.from("c"); // <Buffer 63>
Buffer.concat([buf1, buf2], 5); // 출력: <Buffer 61 62 63 00 00>
// 남는 2 바이트를 0으로 채움!!

6) subarray()

Buffer 객체의 일부를 추출해 새 Buffer 객체를 반환해준다!! slice()와 동일!!

새로운 Buffer를 생성하긴 하지만, 내부 데이터는 원본과 동일하게 참조하기 때문에,

추출한 Buffer를 수정하면 원본도 영향을 받을 수 있다!!

기본 구조

buf.subarray(start[, end])
  • start : 추출 시작 인덱스 
  • end : 추출 종료 인덱스, slice()처럼 종료 인덱스는 추출 결과에 포함하지 않음 (start <= 추출 < end)
    • 기본 값은 buf.length다!! 끝까지 추출한다는 뜻!!
추가로 써먹을 법한 메서드들
변수가 Buffer 객체인지 확인하는 Buffer.isBuffer() → Boolean 값 반환
어떤 값이 Buffer에 포함돼있는지 확인하는 includes(value) → Boolean 값 반환
어떤 값이 Buffer의 몇 번째 인덱스에 있는지 찾는 indexOf(value) → 얘도 못 찾으면 -1 반환
그 외에도 lastIndexOf()도 있고, length도 있고 그렇다!!

 

'TIL&WIL' 카테고리의 다른 글

250106 TIL - trim()  (0) 2025.01.06
250102 TIL - any타입, Namespace 기초  (0) 2025.01.02
3조 KPT 회고  (0) 2025.01.02
241231 TIL - 개인과제02  (0) 2024.12.31
241230 TIL - charAt(), at()  (1) 2024.12.31