Base64-kodningsbibliotek med Arduino

Base64-kodningsbibliotek med Arduino

Base64-kodningsbibliotek med Arduino

Base64 är ett kodsystem som använder 64 symboler grupperade i meddelanden som har en längdmultipel av fyra. Dessa meddelanden (datapaket) kompletteras vid behov med ett plussymbol (så 65 används), ofta likhetstecknet (=), om den användbara informationen som kodas resulterar i en kortare längd.

Innehållsförteckning

    Med hjälp av 64 tecken kan du arbeta med de 10 siffrorna och stora och små bokstäverna (26+26) i koden ASCII, problemet är att det finns 62, låt oss säga, entydiga symboler plus två som varierar i olika implementeringar. Även om det ibland hänvisas till med uttrycket "karaktärer ASCII utskrivbara", i verkligheten är de de som sträcker sig från den som representeras av koden 32 (mellanslag) till 126 (~) de 95 som verkligen kan skrivas ut.

    Implementeringen av kodning Base64 mest använda, det av PEM, som också används av MIMA, arbeta med de extra "+" och "/"-tecknen och "="-tecknet till pad så att paketen har en längdmultipel av fyra. Bokstäverna A-Z upptar positionerna 0-25, bokstäverna a-z upptar positionerna 26-51, siffrorna 0-9 upptar positionerna 52-61, plustecknet (+) positionerna 62 och position 63 upptas av snedstrecket (/ ).

    Sättet att representera data i format Base64 består av att ta, från originaldata, grupper av 6 bitar som representeras med motsvarande kod. Om det finns bitar över fylls de med nollor till höger. Om det resulterande antalet koder inte är en multipel av fyra, fylls det i med likhetstecken till höger.

    Följande bild visar kodningen ASCII av en text ("ohm") och det sätt på vilket den konverteras till Base64. Eftersom det finns 7 symboler, skulle det slutliga meddelandet behöva fyllas med ett likhetstecken i slutet. Man kan säga att texten "ohm" in ASCII motsvarar «b2htaW8=" in Base64.

    Exempel på Base64-kodning

    Specifik användning av kodning Base64 De anger vanligtvis också en maximal linjelängd. Genomförandet MIMA Begränsar varje rad till 76 tecken. Normalt kommer raderna att separeras av en radslutkod (CR, representerad av värdet 0x0D i ASCII) och ytterligare en ny rad (NL, som motsvarar koden ASCII 0x0A).

    Det besvär som tillkommer vid implementering av kodning Base64 på en enhet med få resurser, som ofta är fallet med en mikrokontroller är att du måste koda allt eftersom informationen kommer eller med en buffert minimum, vilket också kräver tillhandahållande av ett system som indikerar att slutet av det ursprungliga meddelandet har nåtts, till exempel genom att lägga till en speciell kod, eller genom att använda en pin vars nivå (synkroniserad med mottagning) indikerar meddelandets status.

    Exempelkoden nedan är en bibliotek för Arduino att koda i Base64 som implementeras med båda kriterierna: kodning av informationen som kommer (utan en buffert) och vänta på att en varningssignal ska avslutas.

    Den grundläggande delen av kodberäkningen Base64 Det görs med uttrycket:
    (valor_original>>(2+(numero_valor%3)*2))|resto_base64
    och beräkningen av resten med uttrycket:
    (valor_original&(MASCARA_B64>>desplazamiento))<<desplazamiento,
    vara desplazamiento ett värde som beräknas med uttrycket:
    4-(numero_valor%3)*2

    Processen som följs för att erhålla dessa uttryck består av att generalisera beräkningen av var och en av de fyra koderna Base64 som är resultatet av att representera tre byte av det ursprungliga värdet.

    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

    Med texten Base64 Pseudokoden ovan hänvisar till koden i Base64 som beräknas. Uttrycket har använts byte_n för att hänvisa till den n:e byten som kodas. Texten resto representerar de överblivna bitarna av byten som kodas. I början av beräkningen antas det att resten är noll

    För tydlighetens skull har 6-bitarsmasken i den föregående pseudokoden inkluderats i beräkningen av alla koder, även om det bara är nödvändigt att bestämma den sista av dem, eftersom de andra roteras så att de två flesta bitarna alltid går förlorade. signifikant.

    Som kan ses är den fjärde koden all rest och det finns inget behov av att beräkna en rest efteråt; Det är därför bara nödvändigt att utföra tre steg, ett per kodad byte. Det är viktigt att komma ihåg att om en tredje byte i ett paket inte var kodad, skulle den sista koden behöva fyllas med nollor till höger. Base64 erhålles.

    För att generalisera, rätt rotation av uttrycket som beräknar koden i Base64 kan representeras som 2+(numero_byte%3)*2 så att delen innanför parentesen skulle rotera från noll till två, vilket resulterar i 2, 4 och 6 vid varje steg. Det är såklart inte det enda sättet att generalisera, men jag har valt den här för funktionalitet och framför allt för tydlighetens skull. Eftersom masken (AND) bara var nödvändig i den fjärde koden och det redan har setts att det inte är nödvändigt att beräkna den (det är resten), ingår den inte i det slutliga uttrycket för att förenkla det, även om vi måste komma ihåg att den typ av data som används (byte) endast de 6 minst signifikanta bitarna tas.

    Restens vänsterrotation kan generaliseras på ett sätt analogt med det föregående. Det kan också ses att masken som appliceras (AND) genomgår samma bitrotation men i motsatt riktning. Det är anledningen till att beräkna förskjutningen med 4-(numero_valor%3)*2 innan den tillämpas i den mening som motsvarar varje del av uttrycket.

    Följande exempel visar hur du använder biblioteket för att koda en textsträng (kom ihåg att Base64 kan användas för vilken datauppsättning som helst, till exempel en bild). I följande kod finns ett par detaljer som är intressanta att förtydliga. Först har en speciell symbol (symbolen ~) använts för att indikera slutet på texten, istället för en hårdvarusignal eller för att indikera textens längd. Logiskt sett kan den symbolen inte vara en del av den data som kodas.

    Den andra frågan som måste beaktas, lika viktig som den är uppenbar, är att avkodaren på destinationen måste veta hur informationen som når den representeras. Texten innehåller tecken som inte hör till uppsättningen ASCII utskrivbara (från 32 till 126), bokstäver med accent, till exempel. Arduino kommer att använda två byte (UTF-8) för att representera dessa tecken. Den vanliga kan inte helt enkelt användas \0 som en textterminator eftersom, i många fall, den första byten som ett tecken representeras med kommer att vara exakt noll.

    Rad 26 i föregående exempel visar användningen av bibliotek för Arduino att koda i Base64. Det är bara nödvändigt att ange metoden convertir varje byte du vill koda och valfritt om det är den sista eller, om inte, stoppa konverteringen med metoden terminar när du når slutet.

    Som kan ses i skärmdumpen nedan, exempelprogrammet för bibliotek för Arduino att koda i Base64 visar först texten som ska kodas in Base64, i det här fallet, början på jättarnas berömda sång Les Luthiers, och därefter resultatet av inkodning Base64 använder formatradslängd MIMA.

    Base64-kodning med Arduino. Exempel på textkonvertering

    Post kommentar

    Du kanske har missat