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 |