【问题标题】:Confused about how Buffer encodes base64 in node.js对 Buffer 如何在 node.js 中编码 base64 感到困惑
【发布时间】:2015-11-29 01:11:43
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js encoding utf-8


    【解决方案1】:

    您传入的编码告诉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编码的,所以它会在存储之前尝试对其进行解码,这意味着它将首先执行@987654327的等价物@,它将“Man”变成,然后Buffer存储这两个字节。

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

    基于此,试试Buffer("TWFu","base64"),看看你是否明白它为什么会返回它所做的事情。

    【讨论】:

    • 感谢您周到的回答。我可能有一个不正确的假设——Node.js 中的所有字符串都在 ucs2 中编​​码。我知道大多数浏览器 javascript 实现都是这种情况。我假设 Buffer 会采用 ucs2 编码的原始字节,并将它们映射到代码点,然后映射到您选择的编码的原始字节。
    • 不用担心。公平地说,the Buffer docs 当然可以更明确地说明这一点。他们不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多