4883

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

Лекция

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

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

Русский

2012-11-28

41.5 KB

51 чел.

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

}


 

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

25972. Сущность аудиторских доказательств 37 KB
  Аудитор в процессе проверки должен получить достаточную и достоверную информацию свидетельства доказательства которая подтвердит что бухгалтерская финансовая отчетность отражает финансовое положение предприятия а также что она составлена в соответствии стандартов и законодательству РФ. Отнести к аудиторским доказательствам можно: первичные документы; бухгалтерские записи; полученная из других источников информация. Оценить количественную меру доказательств достаточность и качественную меру смысловой нагрузки доказательства к...
25973. Аудиторские процедуры 29.5 KB
  Собирая доказательства аудиторы используют следующие процедуры: проверку арифметических расчетов клиента в зависимости от плана аудиторской проверки оценки системы внутреннего контроля и риска аудиторского она может быть выборочной или сплошной; наблюдение или участие в инвентаризации различных активов клиента инвентаризация в данном случае рассматривается как метод получения ценных и достоверных доказательств о реальности и точности активных статей баланса и фактов совершения хозяйственных операций; наблюдение за выполнением отд. Для...
25974. Аудиторский риск. Анализ компонентов риска 35 KB
  Анализ компонентов риска Аудит базирующийся на риске это такой вид аудита когда проверка может производиться выборочно исходя из условий работы предприятия в основном узких мест критических точек в его работе. Сосредоточив аудиторскую работу в областях где риски выше можно сократить время затрачиваемое на проверку областей с низким риском. С проведением аудита непосредственно связаны следующие виды риска: предпринимательский и аудиторский.
25975. Аудиторское заключение 35 KB
  Аудиторское заключение официальный документ предназначенный для пользователей бухгалтерской финансовой отчетности аудируемых лиц содержащий выраженное в установленной форме мнение аудиторской организации индивидуального аудитора о достоверности бухгалтерской финансовой отчетности аудируемого лица. Заключение аудиторской организации по результатам проверки годовой отчетности является неотъемлемым элементом годовой бухгалтерской отчетности для предприятий подлежащих в соответствии с действующим законодательством обязательному аудиту....
25976. Аудит сохранности и учета производственных запасов 58.5 KB
  Целью аудита МПЗ является формирование мнения о достоверности показателей отчетности по статьям материальных ценностей «Запасы» и о соответствии применяемой в организации методики учета и налогообложения, действующим в Российской Федерации нормативным документам.
25977. Аудит учета готовой продукции, её отгрузки и реализации 39.5 KB
  Далее уточняется как оценивается готовая продукция; правильность оценки и определения себестоимости каждого вида продукции; правильность расчета отклонений фактической себестоимости от плановой нормативной и составления бухгалтерских проводок по учету готовой продукции; соответствие данных аналитического учета готовой продукции с данными синтетического учета. Полноту оприходования произведенной продукции можно проверить путем составления альтернативного баланса расхода сырья и материалов выхода готовой продукции исходя из нормативных...
25978. Аудит учета нематериальных активов 40 KB
  При анализе системы внутреннего контроля аудитор обращает внимание на следующее: определен ли круг лиц ответственных за сохранность нематериальных активов; каким образом организация обеспечивает неразглашение коммерческой тайны; создана ли комиссия по приемке нематериальных активов; проводится ли инвентаризация нематериальных активов. Чтобы сделать вывод об организации бухгалтерского учета аудитор анализирует учетную политику на момент раскрытия в ней информации: о способах оценки нематериальных активов приобретенных не за...
25979. Холодная пластическая деформация 169 KB
  Основными механизмами сдвиговой пластической деформации кристаллических тел являются скольжение и двойникование. Скольжение - это такое перемещение одной части кристалла относительно другой, при котором кристаллическое строение обеих частей остается неизменным
25980. Аудиторская проверка финансовых вложений 43 KB
  Как и при проверке других активов аудитор исходит из предпосылок: полноты все финансовые вложения отражены в бухгалтерском учете и бухгалтерской отчетности не существует неучтенных финансовых вложений: в бухгалтерском учете и отчетности отражены все приобретенные организацией ценные бумаги и выданные займы; сальдо и обороты по счетам синтетического учета финансовых вложений совпадают с сальдо и оборотами по счетам аналитического учета; сальдо и обороты по счетам в полном объеме перенесены из регистров бухгалтерского учета в Главную книгу и...