使用WebSockets替代Base64编码

时间:2013-07-03 13:48:40

标签: encoding websocket base64

可以与WebSockets一起使用的二进制数据编码的替代方法是什么?我只知道你可以使用Base64。还有其他人吗?

2 个答案:

答案 0 :(得分:4)

由于基本上所有支持WebSocket的浏览器现在都支持通过Typed Arrays(arraybuffers)和Blob发送/接收原始二进制数据,因此很少需要将二进制数据编码为文本。只有少数情况下这是必要的:

  • 使用内置WebSocket支持的浏览器web-socket-js回退,如Internet Explorer 6-9和firefox 3.6。请注意,web-socket-js不支持二进制数据的原因是因为这些浏览器不支持Typed Arrays和Blob,因此“二进制”数据已经在浏览器中以某种方式编码(通常是0-255的正常数字数组) )或作为具有非ASCII字符值的字符串。
  • 仅支持WebSocket Hixie协议(无法发送原始二进制数据)的浏览器,例如少于6的Safari(移动和桌面)版本。

在这些情况下,base64不是您唯一的编码选项。任何导致有效UTF-8文本的编码(所有版本的WebSockets都支持文本格式)都可以。通过atob和btoa函数,Base64恰好在浏览器中非常容易支持。例如,如果您有一个表示二进制字节值的数字数组,那么您可以将其编码为可通过任何WebSocket版本安全发送的JSON字符串:

JSON.stringify([120,32,255])
'[120,32,255]'

它简单且易读,但它比base64的空间效率要低得多。还有更有效的方法将二进制数据编码为UTF-8字符串,这将节省更多的空间,但是,它们最终会在浏览器中消耗更多的CPU资源,并且需要自定义算法将二进制数据映射到UTF- 8个代码点。

答案 1 :(得分:2)

WebSockets支持原始二进制数据。如何公开这取决于您使用的语言/库/ API。在JavaScript /浏览器中,您可以使用类型化数组(ArrayBuffer或Blob)调用send。收到二进制消息时,它将作为其中一种类型提供。 WebSocket浏览器API文档(http://www.w3.org/TR/websockets/)提供了有关如何完成此操作的更多信息。