4883

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

Лекция

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

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

Русский

2012-11-28

41.5 KB

43 чел.

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

}


 

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

76997. Характеристика участников производства, способствующих осуществлению производства по делам об административных правонарушениях 27.05 KB
  Они вправе давать показания по делу; заявлять отводы других участников производства; пользоваться юридической помощью; обжаловать итоговые решения стадий; получать копии процессуальных документов; знакомиться со всеми материалами дела об административном правонарушении. В качестве лиц способствующих осуществлению производства по делу об административном правонарушении могут быть только физические лица. По делу об административном правонарушении подлежат выяснению: 1.характер и размер ущерба причиненного административным правонарушением; В...
76998. Меры обеспечения производства по делам об административных правонарушениях: правовое основание и цели применения, особенности процессуального оформления некоторых мер 28.22 KB
  Меры обеспечения производства по делам об административных правонарушениях применяются в следующих целях: пресечение правонарушения; установления личности нарушителя; составление протокола об административном правонарушении при невозможности его составления на месте выявления нарушения; обеспечение своевременного и правильного рассмотрения дела и исполнения принятого по делу постановления.1 освидетельствование на состояние алкогольного опьянения; 6 медицинское освидетельствование на состояние опьянения; 7 задержание транспортного средства...
76999. Возбуждение дела об административном правонарушении. Поводы и основания. Процессуальное оформление 26.14 KB
  Возбуждение дела об административном правонарушении. Возбуждение дела об административном правонарушении начальная стадия производства. Применительно к производству по делам об административных правонарушениях данная стадия имеет специфическое процессуальное оформление. Поскольку составление такого протокола отнесено к компетенции соответствующего полномочного должностного лица постольку инициатором возбуждения дела является именно оно в некоторых случаях представитель общественного объединения.
77000. Протокол об административном правонарушении: содержание, требования, предъявляемые к протоколу, сроки его составления, случаи, когда протокол не составляется 28.31 KB
  Протокол об административном правонарушении: содержание требования предъявляемые к протоколу сроки его составления случаи когда протокол не составляется. Протокол об административном правонарушении процессуальный документ свидетельствующий о совершении данного противоправного деяния конечно предположительно. В Кодексе об административных правонарушениях установлены реквизиты протокола: дата и место составления; данные о его составителях; сведения о личности нарушителя; место время совершения и его существо; нормативный акт...
77001. Административное расследование. Основания для проведения, процессуальное оформление, сроки расследования 27.67 KB
  Составлению протокола об административном правонарушении может предшествовать административное расследовании на основании определения вынесенного должностным лицом уполномоченным составлять такой протокол за предусмотренные КоАП РФ административные правонарушения: монопольного валютного законодательства законодательства о защите прав потребителей охраны окружающей среды пожарной безопасности дорожного движения и на транспорте и др. Административное расследование проводится если осуществляются экспертиза или иные процессуальные...
77002. Место и порядок подготовки дела об административном правонарушении к рассмотрению, разрешаемые вопросы и процессуальное оформление принятого решения 27.19 KB
  Место и порядок подготовки дела об административном правонарушении к рассмотрению разрешаемые вопросы и процессуальное оформление принятого решения. Рассмотрение дела по существу начинается с момента получения субъектом административной юрисдикции протокола об административном правонарушении за которым следует подготовка дела к рассмотрению. Субъекты юрисдикции в порядке подготовки к рассмотрению дела выясняют: относится ли к их компетенции рассмотрение дела; имеются ли обстоятельства исключающие рассмотрение ими дела; правильно ли...
77003. Порядок рассмотрения и разрешения дела об административном правонарушении, сроки рассмотрения, решения, принимаемые по результатам рассмотрения дела 26.52 KB
  Порядок рассмотрения и разрешения дела об административном правонарушении сроки рассмотрения решения принимаемые по результатам рассмотрения дела. Подготовка к рассмотрению дела об административном правонарушении Судья орган должностное лицо при подготовке к рассмотрению дела об административном правонарушении выясняют следующие вопросы: 1 относится ли к их компетенции рассмотрение данного дела; 2 имеются ли обстоятельства исключающие возможность рассмотрения данного дела судьей членом коллегиального органа должностным лицом; 3...
77004. Содержание постановлений и определений, принятых по результатам рассмотрения дела об административном правонарушении 27.61 KB
  Содержание постановлений и определений принятых по результатам рассмотрения дела об административном правонарушении. По результатам рассмотрения дела об административном правонарушении может быть вынесено постановление. В постановлении по делу об административном правонарушении должны быть указаны: должность фамилия имя отчество судьи должностного лица наименование и состав коллегиального органа вынесших постановление; дата и место рассмотрения дела; сведения о лице в отношении которого рассмотрено дело; обстоятельства...
77005. Обжалование и опротестование постановления по делу об административном правонарушении. Порядок и сроки обжалования (опротестования). Виды принимаемых решений 27.86 KB
  Обжалование и опротестование постановления по делу об административном правонарушении. Пересмотр постановлений и решений по делам об административных правонарушениях Правом на обжалование постановлений по административному делу обладают: лицо в отношении которого ведется административное дело; потерпевший; законный представитель физического лица; законный представитель юридического лица; защитник и представитель Постановление по делу об административном правонарушении может быть обжаловано: вынесенное судьей – в вышестоящий суд;...