Хранение двоичных данных в строке UTF-8

Я хочу использовать WebSocket для передачи двоичных данных, но вы можете использовать только WebSockets для передачи строк UTF-8.

Кодирование с использованием base64 является одним из вариантов, но я понимаю, что base64 наиболее желательно, когда ваш текст может быть преобразован из одного формата в другой. В этом случае я знаю, что данные всегда будут UTF-8, так лучше ли будет кодировать двоичные данные в строке UTF-8 без оплаты base64 33% от размера?

Этот вопрос в основном является академическим, так как двоичная поддержка, вероятно, будет добавлена ​​в WebSocket в конце концов, а base64 - отличная альтернатива.

Ответ 1

Вы можете использовать кодировку Base-128 вместо кодировки Base-64. Это приведет только к накладным расходам 1/7 против 1/3.

Идея состоит в том, чтобы использовать все кодовые точки Unicode, которые могут быть представлены в одном байте в UTF-8 (0-127). Это означает, что все байты начинаются с 0, поэтому для данных осталось семь бит:

0‍xxxxxxx

Это приводит к кодированию, в котором 7 входных байтов кодируются с использованием 8 выходных байтов:

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

Таким образом, отношение выходного сигнала к входу равно 8/7.

Ответ 2

Base64 лучше всего использовать, когда строки не поддерживают двоичный blob, а также при изменении текстовой кодировки - обычно символы, используемые в Base64, безопасны во всех кодировках (были там в течение длительного времени).

Если вы знаете, что это всегда UTF8, можете ли вы закодировать его таким образом, чтобы использовать много тысяч символов UTF8?

Ответ 3

Вы можете использовать Base-91. Хуже всего накладные расходы - 23%. Base-128 имеет 1/7 = 14%.