кодировка base64, которая не использует символы "+ / =" (плюс или равно)? - PullRequest
9 голосов
/ 09 декабря 2010

Мне нужно закодировать строку длиной около 1000 символов, которая может быть любым байтовым значением (00-FF).Я не хочу использовать Hex, потому что он недостаточно плотный.проблема с base64, насколько я понимаю, состоит в том, что он включает в себя символы + / и =, которые я не могу допустить в своем приложении.

Есть предложения?

Ответы [ 6 ]

10 голосов
/ 09 декабря 2010

Выберите ваши замены.Рассмотрим некоторые другие варианты: таблица вариантов base64 из Википедии .

В то время как кодировщик / декодеры base64 тривиальны, замену можно выполнить на простом этапе до / после обработки существующие функции кодирования / декодирования base64 (внутри упаковщиков) - нет необходимости заново изобретать колесо (полностью).Или, что еще лучше, как указывает г-н Скит, найдите существующую библиотеку с достаточной гибкостью.

Если у вас нет альтернативных подходящих «забавных» символов на выбор (возможно, все остальные символы недействительны, оставляя только62 буквенно-цифровых символа на выбор), вы всегда можете использовать escape-символ для очень небольшого (~ 3/64?) Увеличения размера .Например, 0 (A) будет кодироваться как «AA», 62 (+) будет кодироваться как «AB», а 63 (/) будет кодироваться как «AC».Это также может быть сделано до / после шага, если вы не хотите писать свой собственный кодер / декодер с нуля.Недостаток этого подхода заключается в том, что отношение выходных символов к входным байтам не является фиксированным.

8 голосов
/ 23 сентября 2013

Base58Check является опцией.Он начинает становиться чем-то вроде стандарта де-факто в адресах криптовалют.

Основные улучшения по сравнению с Base64:

  • Только буквенно-цифровые символы [0-9a-zA-Z]
  • Нет похожих символов: 0OIl / 0OIl
  • Нетпунктуация для запуска переноса слов или разрыва строки в документах и ​​электронных письмах
  • Можно также выбрать все значение одним двойным щелчком мыши без использования знаков препинания.

утилита адреса биткойн - пример реализации;предназначен для биткойнов.

Примечание. Новый стандарт де-факто может не соответствовать вашим потребностям.Неясно, будет ли метод кодирования Base58Check формализован для текущих протоколов .

6 голосов
/ 09 декабря 2010

Если вас беспокоят именно эти символы, и вы можете найти другие символы для использования вместо них, тогда как насчет реализации собственного модуля base64?Это не так уж сложно.

2 голосов
/ 09 декабря 2010

Как говорит Ciaran, реализовать base64 не так уж сложно, но вы, возможно, захотите взглянуть на существующие библиотеки, которые позволяют вам указать собственный набор символов для использования. Я почти уверен, что есть много, но вы не указали, для какой платформы вам это нужно.

По сути, вам просто нужно 65 символов ASCII, которые являются приемлемыми - предпочтительно в дополнение к разрывам строк.

1 голос
/ 09 декабря 2010

Вы можете использовать вместо Base32 . Менее плотный, чем Base64, но полностью исключает нежелательные символы.

1 голос
/ 09 декабря 2010

Конечно.Почему бы не написать свой собственный кодер / декодер Base64, а заменить эти символы в своем алгоритме.Конечно, он не сможет быть декодирован обычным декодером, но если это не проблема, почему бы не беспокоиться об этом.Но вам лучше иметь как минимум 3 других символа, которые ARE могут использоваться в вашем приложении для представления + / и = 's ...

...