Какую схему кодирования текста вы используете, когда у вас есть двоичные данные, которые нужно отправить по каналу ascii?

Если у вас есть двоичные данные, которые нужно кодировать, какую схему кодирования вы используете?

Я знаю о:

  • Шестнадцатеричное кодирование. Очень простой, но довольно многословный, расширяет один байт до двух.
  • База 64 Наиболее распространенный, не столь многословный, расширяет три байта до четырех.
  • База 85 Не часто, но менее многословно, расширяет четыре байта до пяти.

Существуют ли какие-либо другие схемы кодирования общего пользования? Если да, то в чем заключаются преимущества и недостатки?

Редактировать: это полезно, например, при попытке сохранить произвольные данные в файле cookie. Cookie-файлы могут хранить только текст, а не произвольные данные, поэтому вам необходимо каким-то образом преобразовать их, желательно с возможностью конвертировать их обратно. Кроме того, предположим, что вы используете сервер без сохранения состояния, поэтому вы не можете сохранить состояние на сервере и просто поместите идентификатор в файл cookie. Конечно, если вы сделаете это, вам также понадобится какой-то способ проверить, что то, что пользователь передает вам, - это то, что вы передали пользователю, например, подпись.

Кроме того, поскольку в настоящее время все согласны с тем, что вы должны использовать base64, поскольку он широко распространен, я также укажу, что это то, что я использую... Мне просто любопытно, использовал ли кто-нибудь что-нибудь еще, и если да, то почему.

Редактировать: на тот случай, если кто-то наткнется на это, если вы хотите использовать Base64 для хранения данных в cookie, вам нужно использовать модифицированную реализацию Base64. Смотрите этот ответ по причине почему.

4 ответа

Решение

Для кодирования значений cookie вы должны быть осторожны. Смотрите этот старый ответ:

В файлах cookie версии 0 значения не должны содержать пробелов, скобок, скобок, знаков равенства, запятых, двойных кавычек, косых черт, вопросительных знаков, знаков, двоеточий и точек с запятой. Пустые значения могут не работать одинаково во всех браузерах.

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

Я хотел бы предложить, чтобы быть абсолютно уверенным, что ваш закодированный двоичный файл совместим с cookie, тогда базовое шестнадцатеричное кодирование наиболее безопасно (например, в Java).

редактирование: как подсказал @Paul, существует модифицированная версия Base 64, которая является "безопасной URL" (и, я полагаю, "безопасной куки"). Заметьте, использование модифицированной версии стандартного алгоритма скорее разбавляет его очарование.

редактировать: @shoosh указал, что = используется только для обозначения конца строки base64, чтобы вы могли обрезать =, установите cookie, затем установите = снова, когда вам нужно расшифровать его.

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

Когда-то был UTF-7. Это официально устарело, но все еще работает как ACE (ASCII-совместимое кодирование). Теперь есть IDN.

Base64 является стандартом де-факто. Использование чего-либо еще вызывает проблемы.

Другие вопросы по тегам