Passerords kontroll

Tillbaka till startsidan

ANSI-C har många funktioner för stränghantering. För småprocessorer kan detta vara aldeles för komplexa och omfattande funktioner. Den genererade koden kan också bli onödigt stor. Ett alternativ är att skriva egna anpassade funktioner. Då vet man dessutom bättre hur dom fungerar i detalj.

Mata in en sträng

Ofta behöver man en enkel funktion för att mata in en sträng till en buffer, och avsluta inmatningen med return-tangenten.
Return-tangenten har olika funktion i olika operativsystem. I Windows genererar return-tangenten två tecken i följd,  "\r\n". Linux använder  '\n', Mac använder  '\r'.

Arduinos terminalfönster tillåter olika inställningar. Inmatningsfunktionen nedan är skriven för Windows.
Den fyller en buffer med de inmatade tecknen och avslutar med strängslutstecknet  '\0'  när man trycker på return-tangenten. Vid  (MAX_STRING-1)  tecken slutar den att räkna upp buffern för att förhindra överfyllnad.
I stället för att funktionen ekar de inmatade tecknen kan man eka  putchar_uart('*')  om det gäller inmatning av ett passerord.
Funktionen är blockerande tills den mottagit det rätta return-tecknet.

void string_in_uart( char * string ) //  Expects '\r' + '\n' to end input. Windows style.
{
   unsigned char charCount, c;
   for( charCount = 0; ; charCount++ )
       {
         c = getchar_uart( );       /* input 1 character     */
         string[charCount] = c;     /* store the character   */
         putchar_uart( c );         /* echo the character    */
         if(c=='\r' ) charCount-- ; /* skip and wait for '\n' to end input */               
         if( c=='\n'){ string[charCount] = '\0'; return; } /* end of string and end of input */
         if( charCount == (MAX_STRING-1)) charCount-- ;    /* prevent buffer overflow        */
       }
}

Jämföra strängar

Nu måste den inmatade strängen kunna jämföras med olika lagrade strängkonstanter. Man skickar med bufferns och strängkonstantens startadresser till en funktion  check_password()  som returnerar "1" vid träff och "0" annars.

unsigned char check_password( char * input_string, const char * candidate_string )
{
   unsigned char i;
   for(i=0; ; i++)
     {
       if(candidate_string[i] != input_string[i] ) return 0;  /* no match - give up */
       if( candidate_string[i] == '\0' )           return 1;  /* exact match up to length of candidate */
     }
}

Programmet  password


Med strängkonstanterna i programminnet

Vid programstart så kopieras normalt strängkonstanter över till RAM-minnet, GPU registren, för att bli åtkomliga med indexering eller med pekare. RAM-minnet är litet. Behöver man lagra mycket data i form av strängkonstanter i sitt program så vill man i stället kunna nå dem direkt i från programminnet. Då behöver man använda makron från inkluderingsfilen  pgmspace.h.
Programversionen  password_P  är skriven med användning av dessa makron.


Tillbaka till startsidan

 


William Sandqvist    william@kth.se