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

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

青灯夜游
青灯夜游앞으로
2021-05-14 11:00:362679검색

이 글에서는 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对象4906621e4f28d4de4703165e1c48080e,相应的返回了对应的字符串;

const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

// 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模块是怎么处理的。

首先,传入了efba047232e9c30493e472f2bf6fc120还差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为bc19c5c32cd20c3c3f2e331d6251d270

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 객체 4906621e4f28d4de4703165e1c48080e를 전달하고 이에 따라 해당 문자열이 반환됩니다You

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

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

🎜예: decoder.end() 시 바이트 수가 불완전합니다.🎜🎜🎜decoder.end(buffer), good의 첫 번째 바이트가 전달됩니다. 이때 decoder.end()가 호출되고 해당 버퍼가 반환됩니다. 8a7690cd30bf38768ffb3bf3dacc5f30. 🎜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으로 문의하시기 바랍니다. 삭제