zoukankan      html  css  js  c++  java
  • NodeJS学习笔记 (29)二进制解码-string_decoder(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide

    自己过一遍:

     

    模块简介

    string_decoder模块用于将Buffer转成对应的字符串。使用者通过调用stringDecoder.write(buffer),可以获得buffer对应的字符串。

    它的特殊之处在于,当传入的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('string_decoder').StringDecoder;
    const decoder = new StringDecoder('utf8');
    
    // Buffer.from('你') => <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('string_decoder').StringDecoder;
    const decoder = new StringDecoder('utf8');
    
    // Buffer.from('你好') => <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('string_decoder').StringDecoder;
    const decoder = new StringDecoder('utf8');
    
    // Buffer.from('你好') => <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('string_decoder').StringDecoder;
    
    // Buffer.from('好') => <Buffer e5 a5 bd>
    let decoder = new StringDecoder('utf8');
    let str = decoder.end( Buffer.from([0xe5]) );
    console.log(str);  // �
    console.log(Buffer.from(str));  // <Buffer ef bf bd>

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

    Returns any remaining input stored in the internal buffer as a string. Bytes representing incomplete UTF-8 and UTF-16 characters will be replaced with substitution characters appropriate for the character encoding.

    相关链接

    你应该记住的一个UTF-8字符「EF BF BD」 http://liudanking.com/golang/utf-8_replacement_character/

  • 相关阅读:
    教您搭建与布署NTP网络时钟服务器
    利用北斗卫星系统设计NTP网络时间服务器
    GPS同步时钟(北斗时间服务器)守时方法研究
    京准讲述NTP时钟服务器应用及原理
    标准化考场时钟系统(电子时钟)时间同步设备
    北斗授时产品详解与应用
    IRIG-B码对时是变电站自动化系统的基本要求
    北斗同步时钟(主时钟控制器)应用于电气化铁道远动系统
    IEEE1588PTP在数字化变电站时钟同步方面的应用
    thinkphp6学习教程与源码 tp6开源CMS系统源码研究
  • 原文地址:https://www.cnblogs.com/eret9616/p/9197261.html
Copyright © 2011-2022 走看看