NodeJS 모듈 버퍼 원리 및 사용법 해석
Buffer는 nodejs 핵심 API로 2진 데이터 흐름을 처리하는 기능을 제공합니다.Buffer의 사용은 ES2017의 Uint8Array와 매우 비슷하지만 node의 특성으로 인해 더욱 깊이 있는api를 제공합니다.
Uint8Array의 글자 뜻은 8비트 무기호 정형 수조입니다.한 바이트는 8bit이고, 바이트의 표시도 두 개의 16진법 (4bit) 의 숫자로 이루어져 있다.
const buf = Buffer.alloc(1);
console.log(buf);//output:
어떻게 메모리 더미를 신청합니까
버퍼는 nodejs의 메모리 크기에 대한 제한을 벗어날 수 있습니다.nodejs12는 4개의api를 제공하여 메모리 더미를 신청합니다.
메모리를 신청할 때, 아마도 이 메모리는 이전에 다른 데이터를 저장한 적이 있을 것이다.원본 데이터를 제거하지 않으면 데이터 유출의 안전 위험이 있다.원본 데이터를 지우면 속도가 느려집니다.구체적으로 어떤 방식을 쓰는지는 실제 상황에 따라 정한다.
function pollifyAlloc(size, fill = 0, encoding = "utf8") {
const buf = Buffer.allocUnsafe(size);
buf.fill(fill, 0, size, encoding);
return buf;
}
Buffer.allocUnsafe vs Buffer.allocUnsafeSlow이름에서 바로 효과를 볼 수 있습니다, 버퍼.allocUnsafeSlow가 더 느립니다.버퍼를 사용하기 때문이다.allocUnsafe에서 새 버퍼 인스턴스를 만들 때 할당할 메모리가 4KB보다 작으면 미리 할당된 버퍼에서 잘라냅니다.이것은 쓰레기 회수 메커니즘이 독립된 버퍼를 너무 많이 만들어서 과도하게 사용하는 것을 피할 수 있다.
이런 방식은 추적과 정리의 수요를 없애고 성능과 메모리 사용을 개선한다.
바이트 길이를 계산하는 방법
Buffer를 사용하면 데이터의 실제 바이트를 얻을 수 있습니다.예를 들어 한자의 문자 길이는 1이다.그러나utf8 인코딩된 한자이기 때문에 3바이트를 차지한다.
버퍼를 직접 이용하세요.byteLength () 는 문자열 지정 인코딩의 바이트 길이를 얻을 수 있습니다.
conststr = "본문 원문 주소: xxoo521.com"
console.log(Buffer.byteLength(str, "utf8"));//output: 31
console.log(str.length);//output: 19
Buffer 인스턴스의 length 속성에 직접 액세스할 수도 있습니다(권장되지 않음):
console.log(Buffer.from(str, "utf8").length);//output: 31
문자 인코딩 변환 방법
현재 지원하는 인코딩 형식은 ascii,utf8,utf16le,ucs2,base64,latin1,binary,hex입니다.기타 인코딩은 삼방 라이브러리를 빌려 완성해야 한다.
다음은 버퍼를 사용합니다.from () 및 buf.toString()에서 봉인된 nodejs 플랫폼의 인코딩 변환 함수:
function trans(str, from = "utf8", to = "utf8") {
const buf = Buffer.from(str, from);
return buf.toString(to);
}
// output: 5Y6f5paH5Zyw5Z2AOiB4eG9vNTIxLmNvbQ==
console.log(trans(" : xxoo521.com", "utf8", "base64"));
공유 메모리 및 복제 메모리버퍼 실례를 생성하고 바이너리 데이터를 조작할 때 인터페이스가 공유 메모리를 기반으로 하는지 아니면 복사 베이스 메모리를 기반으로 하는지 절대 주의해야 한다.
예를 들어 버퍼 실례를 생성하는from()에 대해 서로 다른 유형의 매개 변수는 nodejs 밑바닥의 행위가 다르다.
좀 더 형상적으로 해석하기 위해서 아래 두 단락의 코드를 보십시오.
코드 1:
const buf1 = Buffer.from("buffer");
const buf2 = Buffer.from(buf1);//매개 변수에서buffer의 데이터를 새로운 실례로 복사
buf1[0]++;
console.log(buf1.toString());//output: cuffer
console.log(buf2.toString());//output: buffer
코드 2:
const arr = new Uint8Array(1);
arr[0] = 97;
const buf1 = Buffer.from(arr.buffer);
console.log(buf1.toString());//output: a
arr[0] = 98;
console.log(buf1.toString());//output: b
두 번째 세그먼트 코드에서 Buffer를 전송합니다.from의 매개 변수 형식은arrayBuffer입니다.그래서 버퍼.from은 기본 메모리를 복사하는 것이 아니라 보기를 만드는 것입니다.buf1과arr의 메모리는 공유됩니다.
버퍼를 조작하는 과정에서 공유와 복사의 차이에 특히 주의해야 하며 오류가 발생하면 조사하기 어렵다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ansible Module - Setupansible facts 란 ansible facts 는 remote host 에 대한 정보를 의미하며 배포판 종류, 버전, IP Address, file system 정보등을 포함. ansible 은 playboo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.