4883

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

Лекция

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

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

Русский

2012-11-28

41.5 KB

50 чел.

Кодирование данных. Алгоритм 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");

}


 

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

29953. Чрезвычайные ситуации природного характера. Общая характеристика чрезвычайных ситуаций природного характера, их классификация 31.5 KB
  Общая характеристика чрезвычайных ситуаций природного характера их классификация Ответ: Чрезвычайная ситуация природного характера это неблагоприятная обстановка на определенной территории сложившаяся в результате опасного природного явления которое может повлечь за собой человеческие жертвы ущерб здоровью людей материальные потери и нарушение условий жизнедеятельности населения. Классификация чрезвычайных ситуаций природного характера: Ситуации геофизического характера извержения вулканов и землетрясения; Ситуации...
29954. Природные чрезвычайные ситуации геологического происхождения: землетрясения, извержения вулканов, оползни и обвалы. Их последствия, мероприятия по защите населения! 36.5 KB
  Наиболее типичные последствия землетрясений: опасные геологические явления обвалы камнепады оползни снежные лавины сели; цунами сейши наводнения; пожары; паника; травмирование и гибель людей; повреждение и разрушение сооружений и зданий; выбросы радиоактивных аварийно химически опасных и других вредных веществ; транспортные аварии и катастрофы; нарушение работы систем жизнеобеспечения. Меры по защите населения от землетрясений: строительство на территориях подверженных землетрясениям сейсмостойких сооружений и...
29955. Природные чрезвычайные ситуации метеорологического происхождения: ураганы, бури, смерчи и их последствия; меры, принимаемые по защите населения 34.5 KB
  Последствиями воздействия ураганов бурь и смерчей являются повреждение и разрушение зданий и сооружений линий электропередачи и связи заносы и завалы на дорогах уничтожение посевов сельскохозяйственных культур повреждение и гибель кораблей. Чаще всего они поражаются летящими предметами и обрушивающимися конструкциями зданий и сооружений. Меры по защите от ураганов бурь и смерчей: точный прогноз и своевременное оповещение населения; уменьшение воздействия вторичных поражающих факторов пожаров прорывов плотин аварий на различных...
29956. Природные чрезвычайные ситуации биологического происхождения: эпидемии, эпизоотии, эпифитотии; меры, принимаемые по защите населения 43 KB
  Эпизоотия это одновременное прогрессирующее во времени и пространстве в пределах определенного региона распространение инфекционной болезни среди большого числа одного или нескольких видов животных значительно превышающее обычно регистрируемый на данной территории уровень заболеваемости. Эти чрезвычайные ситуации возможны при наличии и взаимодействии трех непременных элементов: возбудителя инфекционной болезни путей его передачи и восприимчивых к этому возбудителю людей животных и растений. Основные мероприятий направленные на...
29957. Теоретические подходы к изучению мышления в зарубежной психологии 53 KB
  Теоретические подходы к изучению мышления в зарубежной психологии Мышление это процесс познавательной деятельности индивида включает в себя анализ синтез обобщение условий и требований решаемой задачи и способов ее решения. В настоящее время мышление изучается не только психологией но и философией логикой физиологией кибернетикой лингвитсикой. Мышление как ассоциация представлений Психология мышления стала специально разрабатываться лишь в XX в. Поэтому представители ассоциативной психологии не считали нужным специально исследовать...
29958. Теоретические подходы к изучению мышления в отечественной психологии 59 KB
  Теоретические подходы к изучению мышления в отечественной психологии. Развитие мышления ребенка происходит постепенно. Генетически наиболее ранняя форма мышления нагляднодейственное мышление появляется в конце первого начале второго года жизни еще до овладения им активной речью. Связь мышления с практическими действиями хотя и сохраняется но не является такой тесной прямой и непосредственной как раньше.
29959. Творческое мышление как предмет исследования в психологии 43.5 KB
  Продуктивная умственная деятельность не обеспечивается только свойствами интеллекта она определяется качествами мышления и личной позицией занимаемой субъектом по отношению к своей деятельности. Проблема изучения продуктивного творческого мышления. На основе модели были сконструированы южнокалифорнийские тесты RP тесты творческого мышления Торренса. Выделил 4 особенности творческого мышления: оригинальность семантическая гибкость способность видеть новое спонтанная гибкость способность дальновидения.
29960. Учение о развитии интеллекта Ж.Пиаже и других представителей швейцарской школы 51 KB
  Развитие операционального интеллекта в концепции Пиаже. Позднее Пиаже при изучении детского мышления больше фокусируется на анализе самих действий основными для Пиаже становятся исследования систем операций интеллекта. Важнейшее открытие Пиаже открытие эгоцентризма ребенка как центральной особенности мышления скрытой умственной позиции и как следствие своеобразие детской логики детской речи детских представлений о мире. Феномены Пиаже: 1.
29961. Психологическая сущность и механизмы воображения 45.5 KB
  Воображение и его развитие в детском возрасте Рибо Т. В основе способности к предвосхищению лежит воображение. В старой психологии существовала точка зрения согласно которой воображение не рассматривается как самостоятельный психический процесс поскольку преобразование образа и открытие нового традиционно выделяемые в качестве основных признаков воображения являются необходимыми сторонами любого процесса чувственного отражения действительности и функциями всех психических процессов Вундт Т. Рибо: воспроизводящее воображение = памяти...