Stream 장의 끝에서 우리는 질문을 남깁니다. 다음 코드의 청크 출력은 무엇입니까?
인쇄를 통해 청크는 16진수 두 자리 숫자, 즉 0에서 255 사이의 값을 요소로 하는 Buffer 개체임을 알 수 있습니다. [관련 튜토리얼 추천 : nodejs 영상 튜토리얼, Programming Teaching]
Stream에 흐르는 데이터가 Buffer라고 설명하고 있으니 Buffer의 진짜 모습을 파헤쳐보자!
Node에 Buffer가 도입된 이유는 무엇인가요?
처음에는 JS가 유니코드로 인코딩된 문자열은 처리하기 쉬웠지만, 바이너리와 유니코드가 아닌 문자열은 처리하기가 어려웠습니다. . 그리고 바이너리는 컴퓨터의 가장 낮은 수준의 데이터 형식입니다. 비디오/오디오/프로그램/네트워크 패킷은 모두 바이너리에 저장됩니다. 따라서 Node에서는 바이너리를 연산하기 위한 객체를 도입해야 하므로 TCP 스트림/파일 시스템 및 기타 연산에서 바이너리 바이트를 처리하는 데 사용되는 Buffer가 탄생했습니다.
Buffer는 Node에서 너무 흔하게 사용되기 때문에 Node가 시작될 때 Buffer가 도입되었습니다. require()를 사용할 필요가 없습니다.
ArrayBuffer는 메모리에 있는 바이너리 데이터 조각으로 작동할 수 없습니다. 메모리 자체는 TypedArray 객체 또는 DataView를 통해 작동해야 합니다. 버퍼의 데이터를 특정 형식으로 표현하고 이러한 형식을 통해 버퍼의 내용을 읽고 씁니다. 배열 인터페이스를 배포하고 배열을 사용하여 데이터를 조작할 수 있습니다
가장 일반적으로 사용되는 것은 TypeArray 뷰입니다. , Uint8Array(부호 없는 8비트 정수) 배열 뷰, Int16Array(16비트 정수) 배열 뷰와 같은 간단한 유형의 ArrayBuffer를 읽고 쓰는 데 사용됩니다.
과 Buffer
버퍼 구조
모듈 구조
버퍼는 JS와 C++를 결합한 모듈이며, 성능 부분은 C++로 구현됩니다. 성능 부분은 모두 JS 구현된객체 구조
버퍼 객체는 배열과 유사하며 그 요소는 16진수 두 자리 숫자, 즉 0에서 255까지의 값입니다.
이 예에서 볼 수 있듯이 버퍼의 다른 문자는 다르게 UTF-8 인코딩에서 중국어는 3바이트를 차지하고 영어 및 반자 레이블은 1바이트를 차지합니다입력 요소가 10진수/음수/255를 초과하면 어떻게 되나요? ?
왜 Buffer에 표시된 16진수 시스템은 실제로는 여전히 메모리에 저장되어 있지만 Buffer는 메모리 데이터를 표시할 때 16진수를 사용합니다. 예를 들어, 총 16비트입니다.
Buffer 00000001 00100011
,如果直接这样显示不太方便就转成为了16进制<buffer></buffer>
크기 바이트의 버퍼를 할당합니다. allocUnsafe는 Buffer.alloc처럼 결과가 00으로 초기화되지 않는 것으로 나타났습니다.
allocUnsafe 호출 시 할당된 메모리 세그먼트가 초기화되지 않아 메모리 할당 속도가 매우 느리지만, 할당된 메모리 세그먼트에 오래된 데이터가 포함될 수 있습니다. 사용 중에 이러한 오래된 데이터를 덮어쓰지 않으면 메모리 누수가 발생할 수 있으므로 속도가 빠르더라도 사용을 피하십시오. Buffer 모듈은 Buffer.poolSize 크기의 내부 Buffer 인스턴스를 빠르게 할당합니다. 메모리 풀. Use allocUnsafe를 사용하여 새 버퍼 인스턴스 생성Buffer.from
콘텐츠를 기반으로 직접 버퍼 생성
Buffer.from(string [, 인코딩])Buffer.from(array) Buffer.from(buffer)Buffer.alloc(size) 사용 지정된 크기를 전달하면 고정 크기 메모리 영역에 적용됩니다. 슬래브에는 다음 세 가지 상태가 있습니다.
full: 완전히 할당된 상태partial: 부분적으로 할당된 상태empty: 아님 할당 상태슬랩 유닛
2KB 버퍼를 할당
2KB 버퍼를 생성한 후, 슬랩 단위 메모리는 다음과 같습니다.
이 할당 프로세스는 할당 방법에 의해 완료됩니다.
버퍼를 다시 생성하면 판단하게 됩니다. 현재 슬라브의 남은 공간이 충분한지 여부. 충분하면 남은 공간을 활용하고 슬래브 할당 상태를 업데이트하세요
슬래브 공간이 부족하면 새 슬래브가 건설되고 원래 슬래브의 남은 공간은 낭비됩니다
대형 객체 할당 8KB를 초과하는 버퍼가 있는 경우 직접 creatUnsafeBuffer 함수로 이동하여 slab 단위를 할당합니다. 이 slab 단위는 이 대형 Buffer 개체에 의해 독점적으로 점유됩니다. 할당 메커니즘은 그림에 나와 있습니다. Buffer의 메커니즘은 그림과 같습니다. 문자 인코딩을 사용하면 Buffer 인스턴스와 JavaScript 문자열을 서로 변환할 수 있습니다Node는 현재 utf8, ucs2, utf16le, latin1, ascii, base64, hex 및 base64Url의 8가지 인코딩 방법을 지원합니다. 특정 구현
일련의 API가 각각 다른 인코딩 방식에 대해 구현될 예정입니다. Node.js는 들어오는 인코딩에 따라 다른 객체를 반환합니다
로 변환합니다. 주로 위에서 언급한 Buffer.from 메소드를 통해 기본 인코딩 메소드는 utf-8
입니다.왜 문자가 깨졌나요? 이 문제를 해결하는 방법?
읽기의 경우 각 읽기의 길이는 4이고 청크 출력은 다음과 같습니다
Fordata += chunk
等价于data = data.toString + chunk.toString
한자 한자가 3바이트를 차지하므로 첫 번째 청크에서 4번째 바이트가 표시됩니다 깨진 문자가 있고 두 번째 청크의 첫 번째와 두 번째 바이트는 텍스트 등을 형성할 수 없으므로 더 많은 노드 관련 지식을 보려면
nodejs tutorial위 내용은 노드의 버퍼에 대해 자세히 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!