我在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的工作方式似乎不一致。有谁知道为什么?任何可以阐明这一点的帮助都非常感激。
答案 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"进入1©
,然后缓冲区存储这两个字节。
> Buffer("Man", "base64").toString()
'1©'
在此基础上,尝试Buffer("TWFu","base64")
,看看你是否理解为什么它会返回它的作用。