【问题标题】:Base64 decode from Buffer to Buffer efficiently in node (node.js)在节点(node.js)中有效地从缓冲区到缓冲区的 Base64 解码
【发布时间】:2010-10-25 00:25:52
【问题描述】:

我目前在noVNC 中有一个 python 和 C 版本的 wsproxy(WebSockets 到普通 TCP 套接字代理)。我想使用 node.js 创建一个 wsproxy 版本。一个关键因素(以及我不只是使用现有节点 WebSocket 代码的原因)是,在 WebSocket 标准具有二进制编码之前,必须对 wsproxy 和浏览器/客户端之间的所有流量进行编码(并且 base64 解码/编码既快速又简单在浏览器中)。

缓冲区类型支持 base64 编码,但这是从缓冲区到字符串,反之亦然。 如何在两个缓冲区之间进行 base64 编码/解码,而无需先转换为字符串?

约束:

  • 直接 Buffer 到 Buffer(除非您可以显示 Buffer->string->Buffer 一样快)。
  • 由于节点具有内置的 base64 支持,我想使用它而不是外部模块
  • 可以在单个缓冲区内进行就地编码/解码。

Here 是关于 node 中 base64 支持的讨论,但据我所知并没有回答我的问题。

【问题讨论】:

  • 闪存回退变得非常缓慢的唯一问题不是吗?否则二进制就可以正常工作,尽管协议中有 UTF-8 编码/解码开销,但它始终存在。无论如何,buffer.copy 在复制和使用toString() 时不应用编码,在快速测试中会慢 150 倍。您可能想在 Node 上提交一个错误,以便缓冲区复制以指定编码进行复制。
  • 由于 WebSockets 数据目前仅限于 UTF-8(希望这在未来的修订版中会有所改变),代理必须对原始套接字数据进行某种编码。闪存回退增加了您无法发送零字节(从技术上讲是合法的 UTF-8)的扭曲。将每个字节编码为 UTF-8 会占用 150% 的空间(任何其他 UTF-8 编码都太慢而无法在 Javascript 中解码)。 Base64 为 133%,因此在空间和处理方面都更加高效。

标签: javascript c++ encoding node.js


【解决方案1】:

您应该可以使用流来执行此操作,但请先阅读此blog about UTF-8 decoding,因为您可能会遇到类似的问题。我并不是建议您在不需要时进行 UTF-8 编码/解码,而是建议您查看此代码如何处理单个字符分布在由块边界分隔的多个字节的问题。

【讨论】:

  • 我可能不太清楚,为了速度,我不想要 Javascript 实现(存在代码),而是原生 Base64 解码例程。我已经有了一种使用本机 base64 例程的方法,但它们首先遍历一个字符串,我想摆脱它。
  • 如果您想要 C++ 代码,那么为什么不采用现有的 Base64 编码/解码代码并使用它来构建您的扩展。顺便说一句,标签不是很清楚,所以我删除了一对并添加了一对。这可能会为您提供更多答案。
猜你喜欢
  • 2014-12-30
  • 2011-08-25
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多