Base64 и HEX для отправки двоичного контента через Интернет в XML-документе - PullRequest
54 голосов
/ 06 июля 2010

Каков наилучший способ отправки двоичного содержимого между системами внутри документа XML

Я знаю, что такое Base64 и Hex, в чем реальная разница.В настоящее время я использую Base64, но для этого мне нужно включить внешнюю библиотеку общих ресурсов, где, как и в случае с HEX, думаю, я мог бы просто создать функцию.

Ответы [ 6 ]

106 голосов
/ 06 июля 2010

Вы могли бы просто написать свой собственный метод для Base64 ... но я бы вообще рекомендовал использовать внешние, хорошо протестированные библиотеки для обоих. (Это не так, как будто их не хватает.)

Разница между Base64 и hex заключается в том, как именно представлены байты. Hex - это еще один способ сказать "Base16". Шестнадцатеричное будет принимать два символа для каждого байта - Base64 принимает 4 символа для каждых 3 байтов, так что это более эффективно, чем шестнадцатеричный. Предполагая, что вы используете UTF-8 для кодирования XML-документа, для файла 100K потребуется 200 КБ в шестнадцатеричном формате или 133 КБ в Base64. Конечно, вполне может быть, что вы не заботитесь об эффективности пространства - во многих случаях это не имеет значения. Если это имеет значение , то очевидно, что Base64 лучше в этом отношении. (Есть альтернативы, которые еще более эффективны, но они не так распространены.)

21 голосов
/ 07 июля 2010

Есть только две «настоящие разницы»:

  1. Основа. Base64 - это base-64, сюрприз, а hex - это base-16.

  2. Кодировка: base-64 кодирует 3 байта источника в 4 символа base-64 (http://en.wikipedia.org/wiki/Base64#Examples); hex кодирует 1 байт в 2 шестнадцатеричных символа.

Таким образом, base64 более компактен, чем гекс.

13 голосов
/ 25 ноября 2014

Другие ответы ясно показали разницу в эффективности между base16 и base64.

Выбор базы - это не только эффективность.

Base64 использует больше, чем просто буквы и цифры. Различные реализации используют разные знаки пунктуации для обозначения заполнения и создания двух последних символов из набора из 64. Они могут включать плюс "+" и равный "=". обе проблемы в строках HTTP-запроса.

Таким образом, одна из причин отдавать предпочтение base16 над base64 состоит в том, что значения base16 могут быть составлены непосредственно в строки HTTP-запроса без дополнительной кодировки. Это важно для тебя?

Обратите внимание, что это дополнительная проблема, сверх эффективности. Ни одна из основ не является лучше или хуже; это всего лишь две разные точки на шкале, в которых вы найдете разные свойства, которые будут более или менее привлекательными в разных ситуациях.

Например, рассмотрим base32 . Он на 20% менее эффективен, чем base64, но все еще подходит для использования в строках HTTP-запросов. Большая часть его неэффективности происходит из-за того, что он не учитывает регистр и избегает нулевого «0» и одного «1», до ошибок при воспроизведении человеком.

Таким образом, base32 вводит новую проблему; легкость воспроизведения для человека. Это тебя беспокоит? Если это не так, вы можете использовать что-то вроде base62, что по-прежнему удобно в строках HTTP-запросов, но чувствительно к регистру и включает ноль «0» и «1».

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

В Википедии есть забавный список систем счисления .

11 голосов
/ 02 ноября 2017

Мне было любопытно, как на EARTH base64 может преобразовать 3 входных байта в 4 выходных байта всего за 33% прироста пространства (тогда как hex преобразует 1 входной байт в 2 выходных байта при 100% приросте пространства).Почему конкретно 3 входных байта?

Ответ:

3 байта = 3 x 8 бит = 24 бита.

Почему это волшебное число "24 бита"?Ну, база 64 представляет числа от 0 до 63. Как они представлены в двоичном формате?С 000000 (0) до 111111 (63).

Бинго!Каждый символ base64 представляет 6 бит входных данных, используя один выходной байт (один символ, такой как «Z» и т. Д.).

Таким образом, 24 бита (3 полных 8-битных байта ввода) / 6 бит (алфавит base64) = 4 байта base64.Вот и все!

Вы можете подумать: «Почему бы не base128 (7 бит ввода = 8 бит вывода), при увеличении размера всего 14% при кодировании?».Ответ заключается в том, что base64 - лучшее, что мы можем найти, поскольку нижние 128 символов ASCII не все для печати.Многие из них являются управляющими символами, такими как NULL и т. Д.

Очевидно, что существуют способы создания других систем, таких как, например, «base81» и т. Д., Поскольку вы можете делать все, что захотите, если создаете собственный алгоритм кодирования.Но прелесть base64 в том, что он так четко кодирует данные кусками по 6 бит.Так что схема кодирования стала популярной.

Теперь, надеюсь, вы стали мудрее, прочитав это.

5 голосов
/ 06 июля 2010

У base64 меньше накладных расходов (base64 создает 4 символа на каждые 3 байта исходных данных, в то время как hex производит 2 символа на каждый байт исходных данных). Шестнадцатеричный код более читабелен - вы просто посмотрите на два символа и сразу узнаете, что за байт позади, но с base64 вам потребуется усилие для декодирования группы из 4 символов, поэтому отладка будет проще с шестнадцатеричным.

4 голосов
/ 15 ноября 2016

Вам важен размер?

Base64 более компактен. Использование 4 символов для представления 3 байтов, где в шестнадцатеричном виде используются 2 символа для каждого байта. Другими словами: hex увеличивает размер строки на 100%. Для небольших строк, которые подходят в качестве параметров в URL-запросах, я не возражаю против дополнительной стоимости / размера.

Вам важна простота использования?

Hex проще в использовании, чем Base64, потому что вам не нужно экранировать (он может содержать +, = и /) при использовании строки в качестве параметра get в URL-запросах.

Для вас важно широкое использование?

У меня нет чисел, но Base64 может быть более известен общему разработчику, чем hex, в зависимости от нескольких факторов. Я знал о base64 задолго до гекса (base16).

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