Node.js :: Buffer :: 바이너리 데이터의 조작, 인코딩, 디코딩을 위한 버퍼 활용 :: Using Buffers to Manipulate, Encode, and Decode Binary Data
버퍼의 길이는 바이트로 지정하며, 버퍼에서는 임의로 바이트를 설정하고, 가져올 수 있다.
utf-8 인코딩된 문자열로 버퍼 생성:
var buf = new Buffer('Hello World!'); // 기본은 utf-8 인코딩.
생성자의 두 번째 인자로 인코딩 방식을 지정:
var buf = new Buffer('8b76fde713ce', 'base64');
사용할 수 있는 인코딩:
- ascii: 아스키.
- utf-8: UTF-8.
- base64: Base64. Base64는 전성 과정에서 데이터를 그래도 보관하게끔 텍스트 문서에 바이너리 데이터를 포함시킬 때 흔히 사용한다.
바이트 크기로 버퍼 생성:
var buf = new Buffer(1024); // creating a 1024 byte buffer
var buf = new Buffer('my buffer content');
// accessing the 10th position of buf
console.log(buf[10]); // -> 99
.
var buf = new Buffer(1024);
console.log(buf[100]); // -> 5 (some random number)
buf[99] = 125; // set the 100th byte to 125
어떤 경우에는 버퍼 작업이 에러를 내보내지 않는다. 예를 들어:
- 버퍼의 특정 위치를 255보다 큰 숫라로 설정하면 해당 위치에는 255로 나눈 값이 대입된다.
- 버퍼 위치에 256 값을 대입하면 실제로는 0 값을 대입하게 된다.
- 100.7 같은 분수 값을 대입하면 버퍼 위치에서는 정수 값(이 경우 100)을 보관한다.
- 경계 범위를 벗어난 위치에 대입하려고 하면 대입이 실패하고 버퍼는 병경되지 않은 채로 그대로 남는다.
var buf = new Buffer(100);
console.log(buf.length); // -> 100
var buffer = new Buffer("this is the content of my buffer");
var smallerBuffer = buffer.slice(8, 19); console.log(smallerBuffer.toString()); // -> "the content"
이때 버퍼를 잘라내더라도 새 메모리가 할당되거나 아무 내용도 복사되지 않는다는 점에 주의하자. 새 버퍼는 부모 버퍼의 메모리를 사용하며 시작 및/또는 종료 위치를 참조할 뿐이다. 부모 버퍼는 작업을 마친후 가비지 컬렉터가 가져갈 수 없게끔 보관해야 한다. 이렇게 하지 않으면 메모리 문제가 생길 수 있다.
var buffer1 = new Buffer("this is the content of my buffer");
var buffer2 = new Buffer(11);
var targetStart = 0;
var sourceStart = 8;
var sourceEnd = 19;
buffer1.copy(buffer2, targetStart, sourceStart, sourceEnd); console.log(buffer2.toString()); // -> "the content"
var str = buf.toString();
.
var utf8String = 'my string';
var buf = new Buffer(utf8String);
var base64String = buf.toString('base64');
- targetBuffer Buffer 객체 - 복사할 Buffer다
- targetStart 숫자, 선택사항, 기본값: 0
- sourceStart 숫자, 선택사항, 기본값: 0
- sourceEnd 숫자, 선택사항, 기본값: buffer.length
대상 메모리의 영역이 원래와 덮어쓰더라도 해당 버퍼의 영역의 데이터를 대상 버퍼의 영역으로 복사한다. targetStart
나 sourceStart
가 undefined
이면 기본값은 0이지만 sourceEnd
의 기본값은 buffer.length
이다.
예제: 두 버퍼를 만들고 buf1의 16 바이트부터 19 바이트까지를 buf2의 8번째 바이트 위치에 복사한다.
buf1 = new Buffer(26);
buf2 = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
buf1[i] = i + 97; // 97 is ASCII a
buf2[i] = 33; // ASCII !
}
buf1.copy(buf2, 8, 16, 20);
console.log(buf2.toString('ascii', 0, 25));
// !!!!!!!!qrst!!!!!!!!!!!!!
예제: 버퍼를 하나 만들고 같은 버퍼에서 한 영역의 데이터를 다른 영역으로 덮어쓴다.
buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
buf[i] = i + 97; // 97 is ASCII a
}
buf.copy(buf, 0, 4, 10);
console.log(buf.toString());
// efghijghijklmnopqrstuvwxyz
저번에 버퍼 생성 방법이 바뀐 걸로 알고있습니다.
Buffer.from(데이터) 입니다. https://nodejs.org/dist/v6.0.0/docs/api/buffer.html