Библиотека кодирования Base64 с Arduino

Библиотека кодирования Base64 с Arduino

Библиотека кодирования Base64 с Arduino

Base64 — это система кодирования, в которой используются 64 символа, сгруппированные в сообщения, длина которых кратна четырем. Эти сообщения (пакеты данных) при необходимости дополняются символом плюса (поэтому используется 65), часто знаком равенства (=), если закодированная полезная информация имеет меньшую длину.

Содержание

    Используя 64 знака, вы можете работать с 10 цифрами, а также прописными и строчными буквами (26+26) кода. ASCII, проблема в том, что имеется 62, скажем так, однозначных символа плюс два, различающиеся в разных реализациях. Хотя иногда их называют выражением «персонажи ASCII для печати», на самом деле это те, которые варьируются от кода 32 (пробел) до 126 (~), 95 действительно пригодных для печати.

    Реализация кодирования Base64 наиболее используемый, из PEM, который также используется MIME, используйте дополнительные знаки «+» и «/» и знак «=» для заполнения, чтобы длина пакетов была кратна четырем. Буквы A-Z занимают позиции 0-25, буквы a-z - позиции 26-51, цифры 0-9 - позиции 52-61, знак плюс (+) - позиции 62, а позицию 63 занимает косая черта (/).

    Способ представления данных в формате Base64 состоит из отбора из исходных данных групп 6 бит которые представлены соответствующим кодом. Если остались биты, они заполняются нулями справа. Если полученное количество кодов не кратно четырем, оно заполняется знаками равенства справа.

    На следующем изображении показана кодировка ASCII текста («ом») и способа его преобразования в Base64. Поскольку символов 7, окончательное сообщение необходимо будет заполнить знаком равенства в конце. Можно сказать, что текст «ом» в ASCII эквивалент «b2htaW8=" в Base64.

    Пример кодировки Base64

    Конкретное использование кодирования Base64 Они также обычно устанавливают максимальную длину строки. Реализация MIME Ограничивает каждую строку 76 символами. Обычно строки разделяются кодом конца строки (CR, представленным значением 0x0D в ASCII) и еще одну новую строку (NL, что соответствует коду ASCII 0x0А).

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

    Пример кода ниже представляет собой библиотека для Arduino для кодирования в Base64 который реализуется по обоим критериям: кодирование поступающей информации (без буфер) и дождитесь завершения предупреждающего сигнала.

    Основная часть расчета кода Base64 Это делается с помощью выражения:
    (valor_original>>(2+(numero_valor%3)*2))|resto_base64
    и вычисление остатка с выражением:
    (valor_original&(MASCARA_B64>>desplazamiento))<<desplazamiento,
    siendo desplazamiento значение, которое рассчитывается с помощью выражения:
    4-(numero_valor%3)*2

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

    Base64=((byte_1>>2)|resto)&0b00111111 resto=(byte_1&0b00000011)<<4
    Base64=((byte_2>>4)|resto)&0b00111111 resto=(byte_2&0b00001111)<<2
    Base64=((byte_3>>6)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0
    Base64=((byte_3>>0)|resto)&0b00111111 resto=(byte_3&0b00111111)<<0

    С текстом Base64 Псевдокод выше относится к коду в Base64 это рассчитывается. Выражение было использовано byte_n для обозначения n-го кодируемого байта. Текст resto представляет собой оставшиеся биты кодируемого байта. В начале расчета предполагается, что остаток равен нулю

    Для наглядности в предыдущем псевдокоде 6-битная маска включена в расчет всех кодов, хотя определить необходимо только последний из них, так как остальные ротируются так, что два самых бита всегда теряются. значительный.

    Как можно видеть, четвертый код представляет собой остаток, и нет необходимости впоследствии вычислять остаток; Поэтому необходимо выполнить всего три шага, по одному на каждый закодированный байт. Важно помнить, что если бы третий байт пакета не был закодирован, последний код пришлось бы заполнить нулями справа. Base64 получен.

    Обобщая, можно сказать, что поворот вправо выражения, вычисляющего код в Base64 может быть представлено как 2+(numero_byte%3)*2 так, чтобы часть внутри круглых скобок вращалась от нуля до двух, в результате чего на каждом шаге получалось 2, 4 и 6. Конечно, это не единственный способ обобщения, но я выбрал его из соображений функциональности и, прежде всего, ради ясности. Поскольку маска (И) была необходима только в четвертом коде и уже было видно, что вычислять ее не обязательно (это все остаток), то она не включается в итоговое выражение для его упрощения, хотя надо помнить что для типа используемых данных (байт) берутся только 6 младших битов.

    Левое вращение остальных можно обобщить аналогично предыдущему. Также можно видеть, что применяемая маска (И) подвергается такому же повороту битов, но в противоположном направлении. По этой причине для расчета смещения 4-(numero_valor%3)*2 перед применением его в смысле, соответствующем каждой части выражения.

    В следующем примере показано, как использовать библиотеку для кодирования текстовой строки (помните, что Base64 может использоваться для любого набора данных, например изображения). В следующем коде есть несколько деталей, которые интересно уточнить. Во-первых, для обозначения конца текста вместо аппаратного сигнала или указания длины текста использовался специальный символ (символ ~). Логично, что этот символ не может быть частью закодированных данных.

    Второй вопрос, который необходимо учитывать, столь же важный, сколь и очевидный, заключается в том, что декодер в пункте назначения должен знать, как представлена ​​информация, которая его достигает. В тексте присутствуют символы, не входящие в набор ASCII печатные (от 32 до 126), например, буквы с ударением. Arduino будет использовать два байта (UTF-8) для представления этих персонажей. Обычный просто так использовать нельзя \0 в качестве признака завершения текста, поскольку во многих случаях первый байт, которым представлен символ, будет точно равен нулю.

    В строке 26 предыдущего примера показано использование оператора библиотека для Arduino для кодирования в Base64. Необходимо только указать метод convertir каждый байт, который вы хотите закодировать, и, при необходимости, является ли он последним или, если нет, остановите преобразование с помощью метода terminar когда ты дойдешь до конца.

    Как видно на скриншоте ниже, пример программы библиотека для Arduino для кодирования в Base64 сначала отображает текст, который нужно закодировать в Base64, в данном случае начало знаменитой песни великанов Лес Лютьерс, а затем и результат кодирования в Base64 использование длины строки формата MIME.

    Кодирование Base64 с помощью Arduino. Пример вывода преобразования текста

    Оставить комментарий

    Вы могли пропустить