노드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 메시지가 출력되기 때문에 alloc
과 from
을 사용하여 버퍼를 생성한다.
버퍼 조작
버퍼 작성
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'