NodeJS 모듈 버퍼 원리 및 사용법 해석

3540 단어 NodeJS모듈Buffer
버퍼는 nodejs에서 중요한 개념과 기능으로서 개발자에게 2진법을 조작하는 능력을 제공했다.본고는 버퍼에 대한 이해와 사용을 깊이 있게 하기 위해 몇 가지 문제를 기록했다.
  • 버퍼 인식
  • 메모리 더미 신청 방법
  • 바이트 길이 계산 방법
  • 바이트 길이 계산 방법
  • 문자 인코딩 변환 방법
  • 공유 메모리 및 복제 메모리 이해
  • 버퍼 인식
    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를 제공하여 메모리 더미를 신청합니다.
  • Buffer.from()
  • Buffer.alloc(size[, fill[, encoding]])
  • Buffer.allocUnsafe(size)
  • Buffer.allocUnsafeSlow(size)
  • Buffer.alloc vs Buffer.allocUnsafe
    메모리를 신청할 때, 아마도 이 메모리는 이전에 다른 데이터를 저장한 적이 있을 것이다.원본 데이터를 제거하지 않으면 데이터 유출의 안전 위험이 있다.원본 데이터를 지우면 속도가 느려집니다.구체적으로 어떤 방식을 쓰는지는 실제 상황에 따라 정한다.
  • Buffer.alloc: 지정한 크기의 메모리를 신청하고 원본 데이터를 지우고 기본적으로 0
  • 을 채웁니다.
  • Buffer.allocUnsafe: 크기 메모리 지정을 요청하지만 원본 데이터를 지우지 않으면 속도가 빠릅니다.
  • 제공된 api에 따라 alloc를 수동으로 실행할 수 있습니다.
    
    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의 메모리는 공유됩니다.
    버퍼를 조작하는 과정에서 공유와 복사의 차이에 특히 주의해야 하며 오류가 발생하면 조사하기 어렵다.
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기