代码之家  ›  专栏  ›  技术社区  ›  Tmdean

以UTF-8字符串存储二进制数据

  •  21
  • Tmdean  · 技术社区  · 14 年前

    我想使用WebSocket传输二进制数据,但只能使用WebSockets传输UTF-8字符串。

    使用base64编码是一个选项,但我的理解是,当您的文本可能从一种格式转换为另一种格式时,base64是最理想的。在这种情况下,我知道数据永远是UTF-8,所以有没有更好的方法可以在不支付base64 33%大小溢价的情况下,用UTF-8字符串编码二进制数据?

    这个问题主要是学术性的,因为二进制支持最终可能会添加到WebSocket中,同时base64是一个完美的cromulent替代方案。

    3 回复  |  直到 8 年前
        1
  •  13
  •   Gumbo    14 年前

    您可以使用base-128编码而不是base-64编码。这只会导致与1/3相反的开销为1/7。

    其思想是使用所有的Unicode码位,这些码位可以用一个字节的UTF-8(0127)表示。这意味着所有字节都以 0 所以数据还有7个位:

    0‍xxxxxxx
    

    这将导致使用8个输出字节对7个输入字节进行编码:

    input:  aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg
    output: 0aaaaaaa 0abbbbbb 0bbccccc 0cccdddd 0ddddeee 0eeeeeff 0ffffffg 0ggggggg
    

    所以输出输入比是8/7。

        2
  •  0
  •   alex    14 年前

    当字符串不支持二进制blob以及文本编码可能发生变化时,最好使用base64—通常,base64中使用的字符在所有字符集中都是安全的(已经存在很长时间)。

    如果你知道它总是utf8,你能用成千上万个utf8字符来编码它吗?

        3
  •  0
  •   Janus Troelsen    13 年前

    你可以使用 Base-91 也是。最坏情况下的开销为23%。Base-128的1/7=14%。