xtensp
@xtensp

Логика кодирования Base64?

Всем Привет!
Нашла код в котором происходит кодирование в base64. Но не смогла понять что именно происходит в теле функции pos_of_char . Просьба объяснить построчно. Особенно непонятно что там возвращает return.
Чтобы понять как всё работает, хочется поиграться с encode - decode. Пользуясь случаем прошу тех кто разбирается показать пример, как можно буквально в несколько строк кода(если это возможно) написать что-то подобное : Вывести на экран слово -- произвести encode -- вывести на экран результат -- произвести decode -- вывести на экран результат. Спасибо!!!
const char* base64_chars[2] = {
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789"
             "+/",

             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789"
             "-_"};

static unsigned int pos_of_char(const unsigned char chr) {

    if      (chr >= 'A' && chr <= 'Z') return chr - 'A';
    else if (chr >= 'a' && chr <= 'z') return chr - 'a' + ('Z' - 'A')               + 1;
    else if (chr >= '0' && chr <= '9') return chr - '0' + ('Z' - 'A') + ('z' - 'a') + 2;
    else if (chr == '+' || chr == '-') return 62; 
    else if (chr == '/' || chr == '_') return 63; 

    throw "If input is correct, this line should never be reached.";
}
  • Вопрос задан
  • 444 просмотра
Решения вопроса 1
@Karpion
Base64 кодирует каждые три байта (24 бита) исходного файла в четыре символа из числа тех, которые проходят текстовую обработку заведомо корректно; количество таких символов, очевидно, равно 64 (шесть бит).

Автор функции пользуется тем, что некоторые символы идут непрерывно. Если бы интервалов непрерывности было больше, то проще было бы сделать табличное преобразование.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
return возвращает число от 0 до 63.
В зависимости от входного символа идёт его преобразование.
Если от A до Z, то возвращает 0, если "A", и 90-65=25, если "Z".
Если от a до z, то возвращает 90-65+1 = 26, если "a" и так далее.
Дальше всё должно быть понятно по логике выше. Код очень легко читается.
Основная суть в том, чтобы запихнуть набор символов "A-Za-z0-9+/" в диапазон чисел от 0 до 63.
Это называется маппингом.
https://en.wikipedia.org/wiki/Base64
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы