관련 추천: "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 이후 버전에서 폐지되었으며 세 가지 별도의 메서드가 제공됩니다:
명확한 책임이 있는 함수 버퍼 인스턴스화 작업을 처리합니다.
// 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으로 반환되지 않음) 메모리 할당 속도가 매우 느리지만 할당된 메모리 세그먼트에 오래된 데이터가 포함될 수 있습니다. . 이러한 오래된 데이터를 덮어쓰지 않고 사용할 경우 메모리 누수가 발생할 수 있으므로 속도가 빠르더라도 사용을 자제하시기 바랍니다. Buffer.from(string [, encoding])
buf.toString([encoding[, start[, end]]])
Buffer.concat(list[, totalLength])
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()); }
한자는 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)); }
결과에서 문자가 깨져 보이는 것을 볼 수 있습니다
rrreee
StringDecoder 인코딩을 얻은 후에는 utf에서 wide 바이트가 3바이트를 차지한다는 것을 알 수 있습니다. 8 이므로 마지막에 불완전한 바이트를 처리할 때 두 번째 write()까지 유지됩니다. 현재는 UTF-8, Base64 및 UCS-2/UTF-16LE만 처리할 수 있습니다.자세히 보기 프로그래밍 관련 지식을 더 보려면 Programming Videos를 방문하세요! !
위 내용은 NodeJS의 버퍼에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!