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

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

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

Base64 е система за кодиране, която използва 64 символа, групирани в съобщения с дължина, кратна на четири. Тези съобщения (пакети данни) се допълват, ако е необходимо, със символ плюс (затова се използват 65), често знак за равенство (=), ако полезна кодирана информация води до по-къса дължина.

Съдържание

    С помощта на 64 знака можете да работите с 10-те цифри и главни и малки букви (26+26) на кода ASCII, проблемът е, че има 62, да кажем, недвусмислени символа плюс два, които варират в различните реализации. Въпреки че понякога се наричат ​​с израза „герои ASCII за печат", в действителност те са тези, които варират от този, представен от кода 32 (интервал) до 126 (~) 95, който наистина може да се отпечата.

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

    Начинът за представяне на данни във формат Base64 се състои от вземане, от оригиналните данни, на групи от 6 бита които са представени със съответния код. Ако има останали битове, те се запълват с нули вдясно. Ако полученият брой кодове не е кратен на четири, той се попълва със знаци за равенство вдясно.

    Следното изображение показва кодирането ASCII на текст ("ом") и начина, по който се преобразува в Base64. Тъй като има 7 символа, последното съобщение трябва да бъде попълнено със знак за равенство в края. Може да се каже, че текстът "ом" в ASCII еквивалентно на «b2htaW8=" в Base64.

    Пример за кодиране Base64

    Специфични употреби на кодиране Base64 Те също така обикновено налагат максимална дължина на линията. Прилагането Мим Ограничава всеки ред до 76 знака. Обикновено редовете ще бъдат разделени от код за край на реда (CR, представен от стойността 0x0D в ASCII) и друг нов ред (NL, който съответства на кода ASCII 0x0A).

    Неудобството, което се добавя при внедряването на кодиране Base64 на устройство с малко ресурси, както често се случва с a микроконтролер е, че трябва да кодирате при пристигането на информацията или с a буфер минимум, което също изисква осигуряване на система, която показва, че краят на оригиналното съобщение е достигнат, например чрез добавяне на специален код или чрез използване на щифт, чието ниво (синхронизирано с приемането) показва статуса на съобщението.

    Примерният код по-долу е a библиотека за Arduino за кодиране в Base64 който се изпълнява и с двата критерия: кодиране на информацията, която пристига (без a буфер) и изчакайте предупредителен сигнал да приключи.

    Основната част от изчисляването на кода Base64 Това се прави с израза:
    (valor_original>>(2+(numero_valor%3)*2))|resto_base64
    и изчисляване на остатъка с израза:
    (valor_original&(MASCARA_B64>>desplazamiento))<<desplazamiento,
    същество 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, в случая началото на известната песен на великаните Les Luthiers, и впоследствие резултатът от кодирането в Base64 използвайки дължина на реда на формата Мим.

    Base64 кодиране с Arduino. Пример за преобразуване на текст

    Публикувай коментар

    Може да сте пропуснали