【发布时间】: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