Перейти к содержимому

Почему меняет кодирование base64 исходную кодировку текста

  • автор:

Функции кодирования строки в base64 и декодирования строки из base64 с учетом кодировки символов

Те, кому часто приходится работать в системе с html-контентом, например, при использовании веб-контролов или при разработке обложек папок, наверно уже заметили, что их очень удобно хранить в системе закодированными в base64. Стандартные функции кодирования/декодирования в/из base64, которые входят в список системных функций кодируют и декодируют строки только в кодировке Windows-1251. Не всегда удобно использовать именно эту кодировку символов, особенно если вы используете какие-то сторонние компоненты, которые обычно имеют кодировку UTF-8. Для возможности кодирования и декодирования строк в других кодировках были разработаны две функции, справка по которым представлена ниже:

Разработку для DIRECTUM 5.2 можно взять тут:

Почему меняет кодирование base64 исходную кодировку текста

Если Интернет является информационной магистралью, то в случае с электронной почтой имеются ограничения. Через нее могут передаваться только небольшие данные.

Транспортная система электронной почты предназначена только для обычного ASCII текста. Попытка отправить текст на других языках или произвольные файлы — это как получить грузовик через овраг.

При попытке отправить текст на других языках или отправить случайный файл — это как попытаться проехать на большом грузовике через маленькое ущелье.

Так как же проехать на грузовике через это маленькое ущелье?

Мы должны разобрать наш грузовик на части и переправить эти части с одного конца на другой.

То же самое происходит, когда вы отправляете вложения по электронной почте. В процессе, известном как кодирование, двоичные данные преобразуются в текст ASCII, который можно без проблем транспортировать по электронной почте. В конце пути данные декодируются и мы получаем исходный файл.

Одним из методов кодирования данных в виде обычного текста ASCII является Base64.

Это один из способов, используемых стандартом MIME для отправки данных, отличных от обычного текста.

Base64 в помощь

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

Первым шагом является преобразование трех байтов в четыре числа из шести бит. Каждый символ в стандарте ASCII состоит из семи битов. Base64 использует только 6 бит (что соответствует 2 ^ 6 = 64 символам), чтобы гарантировать, что закодированные данные могут быть пригодны для печати и читаемы «по-человечески».

Ни один из специальных символов, доступных в таблице ASCII, не используется. 64 символа (отсюда и название Base64) — это 10 цифр, 26 символов в нижнем регистре, 26 символов в верхнем регистре, а также символы «+» и «/».

Например, три байта равны 155, 162 и 233, соответствующий (и пугающий) поток битов равен 100110111010001011101001, который, в свою очередь, соответствует 6-битовым значениям 38, 58, 11 и 41.

Эти цифры преобразуются в символы из таблицы ASCII на втором шаге с использованием таблицы «Base64 encoding». 6-битные значения нашего примера преобразуются в последовательность ASCII «m6Lp».

  • 155 -> 10011011
  • 162 -> 10100010
  • 233 -> 11101001
  • 100110 -> 38
  • 111010 -> 58
  • 001011 -> 11
  • 101001 -> 41
  • 38 -> m
  • 58 -> 6
  • 11 -> L
  • 41 -> p

Этот двухэтапный процесс применяется ко всей последовательности байтов, которые закодированы. Чтобы гарантировать, что закодированные данные могут быть правильно напечатаны и не превышают ограничения почтового сервера, символы новой строки добавляются так, чтобы общая длина строк не превышала 76 символов. Символы новой строки кодируются, как и все остальные данные.

Решение

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

Решение состоит в том, чтобы добавить достаточно байтов со значением «0» для создания 3-байтовой группы. Два таких значения добавляются, если у нас есть один дополнительный байт данных, один добавляется для двух дополнительных байтов.

Конечно, эти искусственные завершающие «0» не могут быть закодированы, используя таблицу кодирования ниже. Они должны быть представлены 65-м символом.

Отступом Base64 является » post-date»>2 мая 2017 года в 11:15

Почему меняет кодирование base64 исходную кодировку текста

Base64 Encoding — кодирование и декодирование данных в формат Base64

Краткое описание

#include gsize g_base64_encode_step (const guchar *in, gsize len, gboolean break_lines, gchar *out, gint *state, gint *save); gsize g_base64_encode_close (gboolean break_lines, gchar *out, gint *state, gint *save); gchar* g_base64_encode (const guchar *data, gsize len); gsize g_base64_decode_step (const gchar *in, gsize len, guchar *out, gint *state, guint *save); guchar* g_base64_decode (const gchar *text, gsize *out_len);

Описание

Base64 это кодировка которая позволяет кодировать последовательность произвольных байт в последовательность печатных ASCII символов. Для определения Base64, смотрите RFC 1421 или RFC 2045. Base64 в основном используется как кодировка передачи MIME для email.

GLib поддерживает возрастающую кодировку используя g_base64_encode_step() и g_base64_encode_close() . Возрастающее декодирование может быть выполнено с помощью g_base64_decode_step() . Для кодировки или декодирования данных в одном направлении, используйте g_base64_encode() или g_base64_decode() .

Поддержка кодировки Base64 была добавлена в GLib 2.12.

Детали

g_base64_encode_step ()

gsize g_base64_encode_step (const guchar *in, gsize len, gboolean break_lines, gchar *out, gint *state, gint *save);

Возрастающее кодирование двоичных данных в строковое представление Base-64. Вызывая эту функцию многократно вы можете конвертировать данные в части избегая необходимости иметь полностью закодированные данные в памяти.

Когда все данные конвертированы вы должны вызвать g_base64_encode_close() для сброса на диск сохранённого состояния.

Буфер вывода должен быть достаточно большим чтобы вместить все данные которые будут в него записаны. Из=за способа кодирования base64 вам потребуется по крайней мере: len * 4 / 3 + 6 байт. Если вы включили прерывание строк (line-breaking) вам потребуется как минимум: len * 4 / 3 + len * 4 / (3 * 72) + 7 байт.

break_lines обычно используются когда данные закодированные в base64-кодировку помещаются в письма (emails). Это распределяет строки в 72 столбца, вместо помещения всего текста в одну строку, что позволяет избежать проблем с длинными строками в почтовой системе.

in : двоичные данные для кодирования.
len : длина in .
break_lines : прерываются ли длинные строки
out : указатель на буфер назначения
state : Сохраняемое состояние между этапами, начиная с 0
save : Сохраняемое состояние между этапами, начиная с 0
Возвращает : Количество записанных байт вывода

Начиная с версии 2.12

g_base64_encode_close ()

gsize g_base64_encode_close (gboolean break_lines, gchar *out, gint *state, gint *save);

Сбрасывает на диск состояние из последовательных вызовов g_base64_encode_step() .

break_lines : прерываются ли длинные строки
out : указатель на буфер назначения
state : Сохраняемое состояние из g_base64_encode_step()
save : Сохраняемое состояние из g_base64_encode_step()
Возвращает : Количество записанных байт

Начиная с версии 2.12

g_base64_encode ()

gchar* g_base64_encode (const guchar *data, gsize len);

Кодирует последовательность двоичных данных в текстовое представление Base-64.

data : двоичные данные для кодирования.
len : длина data .
Возвращает : вновь распределённая, zero-завершённая строка в кодировке Base-64 представляющая данные data .

Начиная с версии 2.12

g_base64_decode_step ()

gsize g_base64_decode_step (const gchar *in, gsize len, guchar *out, gint *state, guint *save);

Возрастающее кодирование последовательности двоичных данных в текстовое представление Base-64. Вызывая эту функцию многократно вы можете конвертировать данные частями избегая необходимость иметь полностью закодированные данные в памяти.

Буфер вывода должен быть достаточно большим чтобы вместить все записываемые в него данные. Так как base64 кодирует 3 байта в 4 символа вам необходимо по крайней мере: len * 3 / 4 bytes.

in : двоичный ввод данных
len : максимальная длина данных in для декодирования
out : буфер вывода
state : Сохраняемое состояние между этапами, начиная с 0
save : Сохраняемое состояние между этапами, начиная с 0
Возвращает : Количество записанных байт вывода

Начиная с версии 2.12

g_base64_decode ()

guchar* g_base64_decode (const gchar *text, gsize *out_len);

Декодирует последовательность текстовой кодировки Base-64 в двоичные данные

text : zero-завершённая строка с текстом в кодировке base64 для декодирования.
out_len : здесь записывается длина декодированных данных.
Возвращает : вновь распределённый буфер который содержит двоичные данные представленные text

Декодер Base64

Ввод текста сначала кодируется как двоичный битовый поток кодов ASCII каждого символа.

Каждые 6 битов битового потока кодируются в разряд base64.

Вывод закодированной текстовой строки base64:

Изображение в пример кодировки base64

Схема URI данных изображения с выводом данных в кодировке base64:

data:image/jpeg;base64, — заголовок схемы URI данных.

/9j/4AAQSkZ. — это закодированные данные base64.

HTML

Фон CSS с URI данных base64

body background-image: url(‘data:image/jpeg;base64,/9j/4AAQSkZ. ‘);
>

Смотрите также

  • Кодировщик Base64 ►
  • Кодировщик URL
  • Декодер URL
  • Изображение в base64
  • Base64 для изображения
  • Конвертер ASCII в двоичный
  • Конвертер ASCII в шестнадцатеричный
  • Конвертер двоичного кода в ASCII
  • Конвертер шестнадцатеричного кода в ASCII
  • Преобразование чисел
  • Преобразование изображений
  • Таблица ASCII
  • Символы Unicode
  • Проверка заголовка HTTP
  • Проверка статуса HTTP
ВЕБ-ИНСТРУМЕНТЫ
  • 301 генератор редиректа
  • Декодер Base64
  • Кодировщик Base64
  • Base64 для изображения
  • Редактор HTML
  • Генератор HTML-ссылок
  • Генератор HTML-таблиц
  • Проверка заголовка HTTP
  • Проверка статуса HTTP
  • Изображение в Base64
  • Онлайн-линейка пикселей
  • Разрешение экрана
  • Тестер разрешения экрана
  • Просмотрщик / редактор SVG
  • Кодировщик URL
  • Декодер URL
  • Размер окна
БЫСТРЫЕ ТАБЛИЦЫ

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *