> 웹 프론트엔드 > JS 튜토리얼 > Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환

Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환

青灯夜游
풀어 주다: 2021-05-14 11:00:36
앞으로
2767명이 탐색했습니다.

이 글에서는 Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환

모듈 소개

string_decoder 모듈은 Buffer를 해당 문자열로 변환하는 데 사용됩니다. 사용자는 stringDecoder.write(buffer)를 호출하여 버퍼에 해당하는 문자열을 얻을 수 있습니다. [추천 학습: "nodejs tutorialstring_decoder模块用于将Buffer转成对应的字符串。使用者通过调用stringDecoder.write(buffer),可以获得buffer对应的字符串。【推荐学习:《nodejs 教程》】

它的特殊之处在于,当传入的buffer不完整(比如三个字节的字符,只传入了两个),内部会维护一个internal buffer将不完整的字节cache住,等到使用者再次调用stringDecoder.write(buffer)传入剩余的字节,来拼成完整的字符。

这样可以有效避免buffer不完整带来的错误,对于很多场景,比如网络请求中的包体解析等,非常有用。

入门例子

这节分别演示了decode.write(buffer)decode.end([buffer])两个主要API的用法。

例子一:

decoder.write(buffer)调用传入了Buffer对象<Buffer e4 bd a0>,相应的返回了对应的字符串;

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;
const decoder = new StringDecoder(&#39;utf8&#39;);

// Buffer.from(&#39;你&#39;) => <Buffer e4 bd a0>
const str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0]));
console.log(str);  // 你
로그인 후 복사

例子二:

decoder.end([buffer])被调用时,内部剩余的buffer会被一次性返回。如果此时带上buffer参数,那么相当于同时调用decoder.write(buffer)decoder.end()

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;
const decoder = new StringDecoder(&#39;utf8&#39;);

// Buffer.from(&#39;你好&#39;) => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.end(Buffer.from([0xbd]));
console.log(str);  // 好
로그인 후 복사

例子:分多次写入多个字节

下面的例子,演示了分多次写入多个字节时,string_decoder模块是怎么处理的。

首先,传入了<Buffer e4 bd a0 e5 a5>还差1个字节,此时,decoder.write(xx)返回

然后,再次调用decoder.write(Buffer.from([0xbd])),将剩余的1个字节传入,成功返回

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;
const decoder = new StringDecoder(&#39;utf8&#39;);

// Buffer.from(&#39;你好&#39;) => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.write(Buffer.from([0xbd]));
console.log(str);  // 好
로그인 후 복사

例子:decoder.end()时,字节数不完整的处理

decoder.end(buffer)时,仅传入了的第1个字节,此时调用decoder.end(),返回了,对应的buffer为<Buffer ef bf bd>

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;

// Buffer.from(&#39;好&#39;) => <Buffer e5 a5 bd>
let decoder = new StringDecoder(&#39;utf8&#39;);
let str = decoder.end( Buffer.from([0xe5]) );
console.log(str);  // �
console.log(Buffer.from(str));  // <Buffer ef bf bd>
로그인 후 복사

官方文档对于这种情况的解释是这样的(跟废话差不多),大约是约定俗成了,当utf8码点无效时,替换成ef bf bd"]

특별합니다 요점은 들어오는 버퍼가 불완전할 때(예를 들어 3바이트 문자 중 2개만 전달되는 경우) 사용자가 stringDecoder.write(buffer를 호출할 때까지 내부 버퍼가 내부적으로 유지되어 불완전한 바이트를 캐시한다는 것입니다. )나머지 바이트를 전달하여 완전한 문자를 입력합니다.

이것은 불완전한 버퍼로 인한 오류를 효과적으로 방지할 수 있으며 네트워크 요청의 패키지 본문 구문 분석과 같은 많은 시나리오에 매우 유용합니다.

시작하기 예

이 섹션에서는 decode.write(buffer)decode.end([buffer])/를 보여줍니다. code>두 가지 주요 API의 사용. <p></p>예 1: <p><a href="https://www.php.cn/course.html" target="_blank" textvalue="编程视频"> <code>decoder.write(buffer) 호출은 Buffer 객체 <Buffer e4 bd a0>를 전달하고 이에 따라 해당 문자열이 반환됩니다You

;rrreee예제 2:🎜🎜decoder.end([buffer]) 호출 시 남은 내부 버퍼를 한번에 반환합니다. 이때 buffer 매개변수를 가져오면 decoder.write(buffer), decoder.end()를 호출하는 것과 같습니다. 같은 시간. 🎜rrreee

🎜예: 여러 바이트를 여러 번 쓰기🎜🎜🎜다음 예는 여러 바이트를 여러 번 쓸 때 string_decoder모듈이 처리되는 방식을 보여줍니다. 🎜🎜먼저 <Buffer e4 bd a0 e5 a5>가 전달됩니다. Good은 이때 여전히 1바이트가 부족합니다. )는 당신을 반환합니다. 🎜🎜그런 다음 decoder.write(Buffer.from([0xbd]))를 다시 호출하고 나머지 1바이트를 전달한 후 Good을 성공적으로 반환합니다. 🎜rrreee

🎜예: decoder.end() 시 바이트 수가 불완전합니다.🎜🎜🎜decoder.end(buffer), good의 첫 번째 바이트가 전달됩니다. 이때 decoder.end()가 호출되고 해당 버퍼가 반환됩니다. <버퍼 ef bf bd>. 🎜rrreee🎜공식 문서에서는 이 상황을 다음과 같이 설명합니다(거의 말도 안 되는 내용과 유사함). 이는 대략적인 관례입니다. utf8 코드 포인트가 유효하지 않은 경우 이를 ef bf bd로 바꾸세요. >. 🎜🎜🎜내부 버퍼에 저장된 나머지 입력을 문자열로 반환합니다. 불완전한 UTF-8 및 UTF-16 문자를 나타내는 바이트는 문자 인코딩에 적합한 대체 문자로 대체됩니다.🎜🎜🎜🎜관련 링크🎜🎜🎜 UTF-8 문자 "EF BF BD"를 기억하세요 http://liudanking.com/golang/utf-8_replacement_character/🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿