Хранение двоичных данных в строке UTF-8 - PullRequest
21 голосов
/ 18 октября 2010

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

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

Этот вопрос в основном носит академический характер, поскольку двоичная поддержка, вероятно, будет в конечном итоге добавлена ​​в WebSocket, и в то же время base64 представляет собой совершенно бесполезную альтернативу.

Ответы [ 3 ]

13 голосов
/ 18 октября 2010

Вы можете использовать кодировку 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.

0 голосов
/ 20 сентября 2012

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

0 голосов
/ 18 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...