>  기사  >  웹 프론트엔드  >  NodeJS의 버퍼에 대한 간략한 분석

NodeJS의 버퍼에 대한 간략한 분석

青灯夜游
青灯夜游앞으로
2020-11-18 17:59:512599검색

NodeJS의 버퍼에 대한 간략한 분석

관련 추천: "node js tutorial"

그때 저는 Node를 시작하기 위해 Pu Ling의 Nine Lights and One Deep NodeJS를 읽었습니다. Pu Dada의 책에서는 연습에 대해 거의 언급하지 않고 원칙에 더 많은 공간을 할애합니다. 많은 사실을 듣고 프론트엔드 엔지니어링 분야에서 NodeJS를 사용하기 시작했지만 모든 곳에서 제약을 받았습니다. 그 이유를 요약하면 NodeJS의 어려운 부분은 파일 작업과 네트워크에 지나지 않는다는 것을 알게 되었습니다. 둘 다 매우 중요한 개체인 스트림에 의존합니다. 이것이 바로 박씨가 그의 책에서 언급하지 않은 것입니다.

버퍼파크 다다님이 책에서 언급하셨는데 실제로는 스트림이 Buffer를 처리하는 것이기 때문에 간략하게 정리가 필요합니다.

버퍼란 무엇입니까

공식 API에 소개된 것처럼 ES6에서 TypedArray를 도입하기 전에 JavaScript에는 바이너리 데이터 스트림을 읽거나 작동하는 메커니즘이 없었습니다. Buffer 클래스는 TCP 및 파일 스트림과 같은 네트워크 스트림과 상호 작용할 수 있도록 NodeJS API의 일부로 도입되었습니다.

이제 TypedArray가 ES6에 추가되었으므로 Buffer 클래스는 NodeJS 작업에 더 최적화되고 적합한 방식으로 Unit8Array API를 구현합니다.

간단히 말하면 Buffer 클래스는 바이너리 데이터를 처리하는 데 사용되는 클래스이기 때문에 전역 변수에 직접 배치하여 사용할 필요가 없습니다.

Buffer 클래스의 인스턴스는 정수 배열과 유사하지만 버퍼 크기는 생성될 때 결정되며 조정할 수 없습니다. Buffer 객체와의 차이점은 V8의 메모리 할당 메커니즘을 거치지 않는다는 점입니다. Buffer는 JavaScript와 C++를 결합한 모듈입니다. 메모리는 C++로 적용되고 JavaScript로 할당됩니다.

버퍼 메모리 할당과 관련된 지식에 대해서는 논의하지 않습니다. 관심 있는 학생들은 Park Laoshi의 책을 읽어보세요.

버퍼 인스턴스화

NodeJS v6 이전에는 생성자를 호출하여 버퍼를 인스턴스화하고 매개변수에 따라 다른 결과를 반환했습니다. 보안상의 이유로 이 메서드는 v6 이후 버전에서 폐지되었으며 세 가지 별도의 메서드가 제공됩니다:

  • Buffer.from()
  • Buffer.alloc()
  • Buffer.allocUnsafe()

명확한 책임이 있는 함수 버퍼 인스턴스화 작업을 처리합니다.

  • Buffer.from(array): 제공된 바이트의 복사본을 포함하는 버퍼를 반환합니다. 배열의 각 항목은 옥텟을 나타내는 숫자이므로 값은 0~255 사이여야 합니다. 그렇지 않으면 모듈로
  • Buffer가 됩니다. .from(arrayBuffer): 지정된 ArrayBuffer와 메모리를 공유하는 새 버퍼를 반환합니다.
  • Buffer.from(buffer): 지정된 버퍼의 복사본을 반환합니다. Buffer
  • Buffer.from(string [, 인코딩 ]): 버퍼를 반환합니다. 주어진 문자열을 포함
  • Buffer.alloc(size [, fill [, 인코딩]]): 지정된 크기와 "채워진" 버퍼를 반환합니다.
  • Buffer.allocUnsafe(size): 다양한 크기의 지정된 버퍼를 반환합니다. 콘텐츠는 buf.fill(0)과 같은 메서드를 사용하여 채워야 합니다.
// 0x 表示 16 进制

Buffer.from([1, 2, 3]) // [0x1, 0x2, 0x3]

Buffer.from('test', 'utf-8') // [0x74, 0x65, 0x73, 0x74]

Buffer.alloc(5, 1) // [0x1, 0x1, 0x1, 0x1, 0x1]

Buffer.allocUnsafe(5); // 值不确定,后面详谈

Buffer.allocUnsafe()Buffer.alloc()보다 빠르게 실행됩니다. 이름은 안전하지 않습니다. , 실제로 안전하지 않습니다. Buffer.allocUnsafe() 的执行会快于 Buffer.alloc() 看名字很不安全,确实也不安全。

当调用 Buffer.allocUnsafe()

Buffer.allocUnsafe() 호출 시 할당된 메모리 세그먼트가 초기화되지 않아(0으로 반환되지 않음) 메모리 할당 속도가 매우 느리지만 할당된 메모리 세그먼트에 오래된 데이터가 포함될 수 있습니다. . 이러한 오래된 데이터를 덮어쓰지 않고 사용할 경우 메모리 누수가 발생할 수 있으므로 속도가 빠르더라도 사용을 자제하시기 바랍니다.

Encoding

Buffer는 다음 인코딩 형식을 지원합니다.
  • 문자열과 버퍼 비교 간단히 e
Buffer.from(string [, encoding])
  • 동시에, 버퍼 인스턴스에는 여러 버퍼 인스턴스가 버퍼 인스턴스
  • buf.toString([encoding[, start[, end]]])
    e
  • stringCoder
  • Buffer.concat(list[, totalLength])
    e
  • stringCoder
  • 로 연결되어 있음을 나타내는 Concat 메서드를 사용하여 버퍼를 문자열
  • const buf = Buffer.from('中文字符串!');
    
    for(let i = 0; i < buf.length; i+=5){
      var b = Buffer.allocUnsafe(5);
      buf.copy(b, 0, i);
      console.log(b.toString());
    }
    E

    BUFFER 스티칭

    으로 변환하는 Tostring 메서드도 있습니다.

    한자는 3바이트로 표현됩니다. 한자를 처리할 때 3의 배수가 아닌 바이트 수를 사용하면 문자 연결 문제가 발생합니다.

    const StringDecoder = require('string_decoder').StringDecoder;
    const decoder = new StringDecoder('utf8');
    
    const buf = Buffer.from('中文字符串!');
    
    for(let i = 0; i < buf.length; i+=5){
      var b = Buffer.allocUnsafe(5);
      buf.copy(b, 0, i);
      console.log(decoder.write(b));
    }

    결과에서 문자가 깨져 보이는 것을 볼 수 있습니다

    하지만 string_decoder 모듈을 사용하면 이 문제를 해결할 수 있습니다

    rrreee

    StringDecoder 인코딩을 얻은 후에는 utf에서 wide 바이트가 3바이트를 차지한다는 것을 알 수 있습니다. 8 이므로 마지막에 불완전한 바이트를 처리할 때 두 번째 write()까지 유지됩니다. 현재는 UTF-8, Base64 및 UCS-2/UTF-16LE만 처리할 수 있습니다.

    Buffer에 일반적으로 사용되는 기타 API

    Buffer에 일반적으로 사용되는 API도 있습니다

    • Buffer.isBuffer: 개체가 Buffer인지 확인
    • Buffer.isEncoding: Buffer 개체의 인코딩 확인
    • buf.length: 바이트 수가 아닌 이 Buffer 인스턴스에 요청된 메모리 바이트 수를 반환합니다. Buffer 인스턴스의 내용
    • buf.indexOf: 배열의 indexOf와 유사하며 변경된 buf에서 특정 문자열, acsii 코드 또는 buf의 위치를 ​​반환합니다.
    • buf.copy: 내용의 일부를 복사합니다. of one buf to another buf

    자세히 보기 프로그래밍 관련 지식을 더 보려면 Programming Videos를 방문하세요! !

    위 내용은 NodeJS의 버퍼에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제