Функции кодирования строки в 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 для улучшения вашего опыта, анализа трафика и отображения рекламы. Учить больше