4883

Кодирование данных. Алгоритм Base64

Лекция

Информатика, кибернетика и программирование

Кодирование данных. Алгоритм Base64. Под кодом понимают определенную систему условных обозначений или сигналов, а процесс кодирования – это переход от одной формы представления информации к другой. При этом целью кодирования, как правило,...

Русский

2012-11-28

41.5 KB

41 чел.

Кодирование данных. Алгоритм Base64.

Под кодом понимают определенную систему условных обозначений или сигналов, а процесс кодирования – это переход от одной формы представления информации к другой.  При этом целью кодирования, как правило, является обеспечение каких-либо преимуществ при хранении, обработке или передаче информации. В качестве примера кодирования информации можно рассмотреть широко известную азбуку Морзе, в которой каждой букве алфавита поставлен в соответствие набор элементарных сигналов «точка» и «тире» . Другим примером является представление числовых данных в различных системах счисления. В данном случае информацией являются числа, а кодом – их запись в соответствии с набором цифр (алфавитом) и правилами конкретной системы счисления.

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

 Поскольку общее количество стандартных печатных знаков (26 строчных букв + 26 прописных + 10 цифр + небольшое количество знаков пунктуации и спец. символов) гораздо меньше диапазона значений произвольного байта данных (0~255), в основе алгоритма Base64 лежит преобразование 8-битной последовательности в последовательность элементов меньшей разрядности. С практической точки зрения наиболее удобно выбрать разрядность элементов выходной последовательности так, чтобы использовалось максимально возможное количество допустимых печатных знаков. Дополнив множество букв и цифр (всего 62 элемента) двумя произвольными знаками пунктуации (обычно ‘+’ и ‘/’), получим удобный код, каждому символу которого можно однозначно поставить в соответствие 6-битное двоичное число (26=64).

В итоге, получаем эффективный алгоритм кодирования: входная последовательность 8-битных данных разбивается на блоки по 3 байта (24 бит), каждый блок разбивается на 4 6-битных элемента (24/6 =4). Далее каждому 6-битному элементу ставится в соответствие один из печатных кодовых символов. В итоге получается последовательность печатных символов, допустимая для передачи по текстовому каналу. При нехватке входных данных для формирования 3-байтного блока, поступают следующим образом: при недостатке одного байта, выходной блок дополняют специальным символом, не входящим в основной кодовый алфавит (обычно ‘=’), при нехватке двух байтов – двумя такими символами.

При раскодировании выполняется обратная процедура – кодовая последовательность «нарезается» на блоки по 4 символа, далее каждому из них ставится в соответствие 6-битное значение и полученная 24-битная строка «нарезается» на блоки по 8 бит.

// Таблица символов кодировки Base64

char B64TABLE[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

const int UNKNOWN_SYMBOL = 100; // При обнаружении недопустимого символа

// Функция кодирует 3 входных байта в 4 выходных

void B64Encode(unsigned char in[3], int len, unsigned char out[4])

{

out[0] = B64TABLE[in[0] >> 2];

out[1] = B64TABLE[((in[0] & 0x03) << 4) | (in[1] >> 4)];

out[2] = B64TABLE[((in[1] & 0x0F) << 2) | (in[2] >> 6)];

out[3] = B64TABLE[in[2] & 0x3F];

 // Если на вход поступило меньше 3х "достоверных" байтов,

 // дополняем выходную последовательность спец. символами '='

 if (len <= 2)

 out[3] = '=';

 if (len == 1)

 out[2] = '=';

}

// Получить индекс символа в таблице B64TABLE

unsigned int getB64Index(unsigned char c)

{

 for (int i=0; i<64; i++)

 if (c == B64TABLE[i])

  return i;

 

 return UNKNOWN_SYMBOL; // Если символ в таблице не найден

}

// Обратное преобразование - 4 входных байта, закодированных

// в Base64, раскодируем в 3 исходных байта, и возвращаем

// количество "достоверных" раскодированных символов

int B64Decode(unsigned char in[4], unsigned char out[3])

{

 for ( int i = 0; i < 4; i++ )

 in[i] = getB64Index( in[i] );

out[0] = ( in[0] << 2 ) | ( ( in[1] & 0x30 ) >> 4 );

out[1] = ( in[1] << 4 ) | ( ( in[2] & 0x3C ) >> 2 );

out[2] = ( in[2] << 6 ) | in[3];

 int len = 3;

 if ( in[2] == UNKNOWN_SYMBOL ) //Символ не найден в таблице ('=')

 len--;

 if ( in[3] == UNKNOWN_SYMBOL )

 len--;

 return len;

}

void main()

{

 char test[] = "Some textx";

 char encoded[100];  // Сюда поместим закодированную последовательность

 

 std::cout << "Original string: "<< test << std::endl;

   // Кодирование

 int j = 0;

 for ( int i = 0; i < strlen( test ); )

 {

 int len = 1;

 unsigned char in[3]; // Временная последовательность для кодирования (буфер)

 

 // Копируем 3 очередных символа из исходной строки в буфер

 in[0] = test[i++];

 if (i<strlen(test))

 {

  in[1] = test[i++];

  len++;

 }

 if (i<strlen(test))

 {

  in[2] = test[i++];

  len++;

 }

 

 unsigned char out[4]; // Буфер для закодированных байтов

 B64Encode(in, len, out);

 // Копируем закодированные байты в результирующую строку

 encoded[j++] = out[0];

 encoded[j++] = out[1];

 encoded[j++] = out[2];

 encoded[j++] = out[3];

 }

 encoded[j] = '\0'; // Добавляем "конец строки" (для вывода на экран)

   // Декодирование

 char decoded[100]; // Сюда поместим раскодированную последовательность

 

 j=0;

 for ( int i = 0; i < strlen( encoded ); )

{

 unsigned char in[4];

 for ( int k = 0; k < 4; k++ )

  in[k] = encoded[ i++ ];

 

 unsigned char out[3];

 int len = B64Decode(in, out);

 for ( int k = 0; k < len; k++ )

  decoded[ j++ ] = out[k];

}

decoded[j] = '\0';

std::cout << "Encoded string: " << encoded << std::endl;

std::cout << "Decoded string: " << decoded << std::endl;

system("pause");

}


 

А также другие работы, которые могут Вас заинтересовать

26400. Законы биологического развития. Онтогенез и филогенез 21 KB
  Закон взаимосвязи организма и внешней среды закон целостности и неделимости организма: целостность биологических систем поддерживается в процессе развития за счёт интеграции систем закон экономии биоматериала и места основной биогенетический закон Геккель – филогенез определяет онтогенез. Филогенез phylon – род племя – исторический путь развития вида. дифференциации: в процессе развития организма органа ткани или клетки однородные структуры разделяются на обособленные отличающиеся друг от друга части благодаря чему меняются формы...
26401. Застенные железы тонкой кишки 24 KB
  Выводной проток ductus pancreaticus открывается в 12перстную кку: лошадь: объединяется вместе с печёночным протоком в фатеров дивертикул; свинья КРС: расстояние между печёночным и панкреатическим протоками – 35 см; собака: может быть несколько добавочных протоков. и вегетативное печёночное нервное сплетение и выходит общий печёночный проток и лимфатические сосуды в воротах лимфоузел. Пузырный проток соединяется с печёночным образуя желчный проток который идёт в 12перстную кишку. Отток лимфы в поясничную истерну грудной лимфатический...
26402. Зев (fauces) 20.5 KB
  Образован мягким нёбом сверху корнем языка снизу и по бокам небноязычными дужками arcus palatoglossus в виде складок слизистой оболочки соединяющих мягкое нёбо с боковыми поверхностями корня языка. В составе кольца – язычная миндалина tonsilla lingualis в виде углублений слизистой с лимфатическими фолликулами в корне языка непарная нёбная миндалина tonsilla veli palatini на основании мягкого нёба у лошадей и свиней парные нёбные tonsilla palatina по бокам от нёбноязычных дужек и миндалины евстахиевых труб у их оснований.
26403. Зейгоподий грудной конечности и локтевой сустав 22.5 KB
  Последняя находится в редуцированном состоянии Зейгоподий и стилоподий формируют локтевой сустав art. Иннервация: из плечевого сплетения plexus brachialis которое образовано вентральными ветвями смешанных спинномозговых 5 6 7 8 шейных нервов и первых двух грудных: лучевой поверхностныйкожу и глубокий иннервирует только разгибатели локтевой срединный межкостный.
26404. Зейгоподий тазовой конечности и коленный сустав 22.5 KB
  Они формируют с бедренной костью самый сложный сустав в организме коленный art. Сустав характеризуется большим количеством внутрисуставных связок крестовидные менискоберцовые менискобедренная межменисковая. К этому суставу относится коленная чашка patella которая представляет из себя сесамовидную кость которая развилась в сухожилии четырехглавого мускула бедра.
26405. Зубы — dentes 24.5 KB
  В короткокоронковых зубах обозначают следующие части: а коронку возвышающуюся над десной. Эмаль самая твердая ткань зуба содержит 95 минеральных веществ устойчива к воздействию химических веществ корма и к механическим воздействиям. Под эмалью находится дентин костная ткань зуба с канальцами. Цвет дентина темноватый; б шейка зуба на месте перехода коронки в корень зуба.
26406. Классификация, строение, топография мышц 20.5 KB
  пластинчатые – в области туловища шеи прикрепляют грудную конечность к туловищу брюшные стенки; 2. В их составе тонкие и длинные мышечные волокна область туловища и поясов конечностей; 2. В области туловища на поверхности блестящее сухожильное зеркало; 3.
26407. Кожный покров: строение, назначение, классификация производных 20.5 KB
  В общий кожный покров integumentum communis входят кожа cutis и её производные. Эпидермис образует производные кожи является многослойным плоским ороговевающим эпителием выполняет защитную и нейросенсорную функции. Дерма содержит производные эпидермиса выполняет опорную трофическую и иммунологическую функции. Производные кожного покрова: роговые волосы рога мякиши копыто копытце коготь и железистые обычные: потовые сальные; молочные: вымя множественное вымя специфические: пахучие защитные сигнальные параанальные и др.
26408. Концевой мозг (telencephalon) 21.5 KB
  В ней заложены центры НД. Кора гирифицирована и условно делится на доли: затылочные – высшие зрительные центры лобные – высшие двигательные центры теменные – чувствительные центры височные – слуховые центры. Под корой – белое вещество плаща который образует проводящие пути 3 типов: коммисуральные полушария между собой – мозолистое тело ассоциативные центры в 1 полушарии проекционные кора с подкоркой и спинным мозгом.