Хранение двоичных данных в строке 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
, поэтому для данных осталось семь бит:
0xxxxxxx
Это приводит к кодированию, в котором 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%.