对于如何在node.js中对Buffer64编码base64感到困惑

时间:2015-11-29 01:11:43

标签: javascript node.js encoding utf-8

我在node.js中使用Buffer来解码base64。我在引擎盖下看了一下,看看Buffer如何存储原始字节数据,我对它是如何工作完全感到困惑。例如,如果我想UTF-8使用Buffer对字符串“©”进行编码,就像这样:Buffer("©", "utf-8").toJSON(),我得到了预期的[194, 169]字节数组。 Buffer("©", "ucs2").toJSON()再次产生[169,0]预期的字节表示。现在,我希望Buffer("Man", "base64").toJSON()[84, 87, 70, 117],它对应于字符串“TWFu”的ascii字节,base64编码等效于“Man”。但是,我改为[49, 169]。这与前两种情况下Buffer的工作方式似乎不一致。有谁知道为什么?任何可以阐明这一点的帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

您传入的编码告诉Buffer对象您也给它的字节序列使用该编码。所以:Buffer("Man","utf8")表示"使用输入" Man"创建一个缓冲区,并将该输入解码为内部存储,就像字节是utf8编码"一样。没问题:是的,所以它做了正确的事情:

> Buffer("Man", "utf8").toString() // note: no dash. The API docs tell us it's just "utf8".
'Man'

现在,如果我们声称字符串" Man"是ucs2编码,我们只是" Man",我们得到这个:

> Buffer("Man", "ucs2").toString()
'M\u0000a\u0000n\u0000'

如果我们尝试Buffer("Man", "base64"),我们会告诉缓冲区字符串" Man"是base64编码的,因此它会在存储之前尝试对其进行解码,这意味着它首先执行相当于atob(input)的操作,这将转变为#34; Man"进入,然后缓冲区存储这两个字节。

> Buffer("Man", "base64").toString()
'1©'

在此基础上,尝试Buffer("TWFu","base64"),看看你是否理解为什么它会返回它的作用。