Skip to content

Instantly share code, notes, and snippets.

@bynaki
Last active March 14, 2019 06:15
Show Gist options
  • Save bynaki/559196064241f5dd776f to your computer and use it in GitHub Desktop.
Save bynaki/559196064241f5dd776f to your computer and use it in GitHub Desktop.
Node.js :: Buffer :: 바이너리 데이터의 조작, 인코딩, 디코딩을 위한 버퍼 활용 :: Usi

Node.js :: Buffer :: 바이너리 데이터의 조작, 인코딩, 디코딩을 위한 버퍼 활용 :: Using Buffers to Manipulate, Encode, and Decode Binary Data

버퍼의 길이는 바이트로 지정하며, 버퍼에서는 임의로 바이트를 설정하고, 가져올 수 있다.

버퍼의 생성 :: CREATING A BUFFER

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
버퍼의 바이트 가져오기 및 설정 :: GETTING AND SETTING BYTES IN A 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
버퍼 잘라내기 :: SLICING A BUFFER
var buffer = new Buffer("this is the content of my buffer");
var smallerBuffer = buffer.slice(8, 19); console.log(smallerBuffer.toString()); // -> "the content"

이때 버퍼를 잘라내더라도 새 메모리가 할당되거나 아무 내용도 복사되지 않는다는 점에 주의하자. 새 버퍼는 부모 버퍼의 메모리를 사용하며 시작 및/또는 종료 위치를 참조할 뿐이다. 부모 버퍼는 작업을 마친후 가비지 컬렉터가 가져갈 수 없게끔 보관해야 한다. 이렇게 하지 않으면 메모리 문제가 생길 수 있다.

버퍼 복사 :: COPYING A BUFFER
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"
버퍼 디코딩 :: DECODING A BUFFER
var str = buf.toString();

.

var utf8String = 'my string';
var buf = new Buffer(utf8String);
var base64String = buf.toString('base64');
buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
  • targetBuffer Buffer 객체 - 복사할 Buffer다
  • targetStart 숫자, 선택사항, 기본값: 0
  • sourceStart 숫자, 선택사항, 기본값: 0
  • sourceEnd 숫자, 선택사항, 기본값: buffer.length

대상 메모리의 영역이 원래와 덮어쓰더라도 해당 버퍼의 영역의 데이터를 대상 버퍼의 영역으로 복사한다. targetStartsourceStartundefined이면 기본값은 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
{"noteId":"15139b754c2-512fdd01","main":"15139b754c2-512fdd01.md","title":"Node.js :: Buffer :: 바이너리 데이터의 조작, 인코딩, 디코딩을 위한 버퍼 활용 :: Using Buffers to Manipulate, Encode, and Decode Binary Data - 버퍼의 생성 :: CREATING A BUFFER - 버퍼의 바이트 가져오기 및 설정 :: GETTING AND SETTING BYTES IN A BUFFER - 버퍼 잘라내기 :: SLICING A BUFFER - 버퍼 복사 :: COPYING A BUFFER - 버퍼 디코딩 :: DECODING A BUFFER - buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])"}
@U-siro
Copy link

U-siro commented Oct 6, 2018

저번에 버퍼 생성 방법이 바뀐 걸로 알고있습니다.
Buffer.from(데이터) 입니다. https://nodejs.org/dist/v6.0.0/docs/api/buffer.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment