image

노드JS의 버퍼 클래스는 Uint8Array API를 구현하는데 사용된다. 자바스크립트의 Uint8Array 클래스의 하위 클래스이다. 버퍼 클래스의 인스턴스는 정수 배열과 비슷하지만 버퍼 크기는 버퍼가 생성될 때 설정되며 변경할 수 없는 고정 길이의 바이트 시퀀스이다. 또한 global scope에 선언되어 있으므로 require 없이 사용할 수 있다.


버퍼 생성

// 크기 지정, 0으로 채워짐
const buf1 = Buffer.alloc(10); // new
const buf2 = new Buffer(10); // old -> deprecated

// 크기 지정, 1로 채워짐
const buf3 = Buffer.alloc(10, 1);

// [0x74, 0x65, 0x73, 0x74] (1byte씩) 버퍼 생성
const buf4 = new Buffer("test"); // new
const buf5 = Buffer.from("test"); // old -> deprecated

new Buffer을 사용하면 deprecation warning 메시지가 출력되기 때문에 allocfrom을 사용하여 버퍼를 생성한다.


버퍼 조작


버퍼 작성

buf1.write("Hello Buffer");
console.write(buf1); // 'Hello Buff', 10 byte만 할당됨

외에도 writeInt16LE 를 통해 버퍼에 값을 쓸 수 있다. 16비트의 Little Indian 형식의 int의 값을 버퍼에 쓴다. int 자리에는 Float, Double, UInt 자료형이 올 수 있으며 int, uint인 경우 16비트와 32비트 모두 사용이 가능하다. BE로 사용하는 경우 Big Indian 형식을 쓸 수 있다.

import { Buffer } from "buffer";

const buf = Buffer.allocUnsafe(2);

buf.writeInt16LE(0x0304, 0); //value[, offset = 0]

console.log(buf);
// Prints: <Buffer 04 03>

버퍼에 작성된 값을 읽기 위해 readInt16LE을 사용할 수 있다.

import { Buffer } from "buffer";

const buf = Buffer.from([0, 5]);

console.log(buf.readInt16LE(0));
// Prints: 1280
console.log(buf.readInt16LE(1));
// Throws ERR_OUT_OF_RANGE.

버퍼 크기

console.log(buf1.length); // 10

버퍼 디코딩

console.log(buf4.toString()); // 'test'

버퍼 합치기

totalLength가 주어지지 않으면 계산하기 위해 추가 루프가 실행되기 때문에 길이를 아는 경우 totalLength를 제공하는게 빠르다.

// Buffer.concat(list[, totalLength]);
buf4 = Buffer.concat([buf1, buf4]);
console.log(buf4.toString()); // 'Hello Bufftest'


Reference