我想使用WebSocket传输二进制数据,但您只能使用WebSockets传输UTF-8字符串。
使用base64对其进行编码是一种选择,但我的理解是,当您的文本可能从一种格式转换为另一种格式时,最理想的是base64。在这种情况下,我知道数据将始终是UTF-8,那么是否有更好的方法来编码UTF-8字符串中的二进制数据而不支付base64的33%大小溢价?
这个问题主要是学术性的,因为二进制支持最终可能会被添加到WebSocket中,而base64在此期间是一个完美的替代方案。
答案 0 :(得分:13)
您可以使用Base-128编码而不是Base-64编码。这只会导致1/3的开销与1/3相反。
我们的想法是使用所有可以在UTF-8(0-127)的单个字节中表示的Unicode代码点。这意味着所有字节都以0
开头,因此数据还剩下7位:
0xxxxxxx
这导致编码使用8个输出字节编码7个输入字节:
input: aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg
output: 0aaaaaaa 0abbbbbb 0bbccccc 0cccdddd 0ddddeee 0eeeeeff 0ffffffg 0ggggggg
因此输出与输入比率为8/7。
答案 1 :(得分:0)
当字符串不支持二进制blob时以及文本编码可能发生变化时,最好使用Base64 - 通常,Base64中使用的字符在所有字符集中都是安全的(已经存在了很长时间)。
如果你知道它总是UTF8,你能否以一种利用数千个UTF8字符的方式对其进行编码?
答案 2 :(得分:0)
您也可以使用Base-91。最坏情况下的开销为23%。 Base-128有1/7 = 14%。