2012-02-06 14 views
5

Próbuję połączyć wyjście szyfrowania AES-256 z ciągiem znaków (aby porównać ten ciąg z zaszyfrowanym ciągiem wysłanym z telefonu z systemem Android).Arduino: awarie i błędy podczas łączenia łańcuchów

Zasadniczo konkatinacja wydaje się działać, ale po kilku błędach uruchamia się (nieczytelne znaki, łańcuch staje się krótszy zamiast dłuższego) lub występują awarie. Jest odtwarzalny, ulega awarii w tym samym punkcie po restarcie.

Wyodrębniłem kilka linii kodu Arduino, które demonstrują problem. Czyni następujące:

  1. Tworzenie liczbę losową i zapisać go do tablicy (robót)
  2. kodowanie AES tej tablicy (robót)
  3. zbudować reprezentację HEX każdego indeksu tablicy (robót)
  4. złączyć wskaźników do string (awarii)

#include <SPI.h> 
#include "aes256.h" //include this lib 

uint8_t key[] = {9,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8, 
       1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 }; //the encryption key 

aes256_context ctxt; //context needed for aes library 


void setup() { 
    Serial.begin(9600); 
} 


void loop() { 

    uint8_t data[] = { 
     0x53, 0x73, 0x64, 0x66, 0x61, 0x73, 0x64, 0x66, 
     0x61, 0x73, 0x64, 0x66, 0x61, 0x73, 0x64, 0x65, }; //the message to be encoded 

    long InitialRandom = random(2147483647); //0 to highest possible long 
    String RandomString = "" ; 
    RandomString+=InitialRandom; //random number to String    
    Serial.println(RandomString); //for debugging 

    //update data array: Random String into data array     
    for (int x=0; x<RandomString.length(); x++){ 
     data[x] = RandomString[x]; 
    } 

    //this encrypts data array, which changes 
    aes256_init(&ctxt, key); //initialize the lib 
    aes256_encrypt_ecb(&ctxt, data); //do the encryption  
    aes256_done(&ctxt); 

    //Here the problem starts............................................. 
    String encrypted=""; //the string I need finally 

    for (int x=0; x<sizeof(data); x++){ //data array is 16 in size  
     int a = data[x]; 
     String b = String (a, HEX); 
     if(b.length()==1) b="0"+b; //if result is e.g "a" it should be "0a"       
     encrypted.concat(b); //this line causes the problem!!! 
     //Serial.println(b); //works perfect if above line commented out  
     Serial.println(encrypted); //see the string geting longer until problems occur  
    } 
    //Here the problem ends............................................. 

     Serial.println(); //go for next round, until crashing 
} 

Przeszukałem fora, próbowałem różnych sposobów łączenia (operator +, strcat). Wszyscy mieli podobne efekty. Czytałem, że biblioteka String miała błąd, zaktualizowała Arduino IDE do wersji 1.0.

ten trzymał mnie zajęty przez kilka dni, każda pomoc jest bardzo ceniona,

Dzięki wielkie!

+0

Jak duży jest ciąg? – Anycorn

+0

Zaczyna się od 0 i rośnie do 32 bajtów (każda pętla for dodaje 2 widoczne bajty) –

Odpowiedz

3

Prawdopodobnie brakuje pamięci, ponieważ Arduino ma tylko niewielką ilość.

Sprawdź, ile pamięci masz free podczas swojej pętli.

Sprawcą może być fakt, że implementacja ciągu (zobacz Arduino WString.cpp) używa realloc(), a pamięć jest prawdopodobnie silnie zdegenerowana za pomocą jednego lub dwóch ciągów bajtowych (każdy z nich ma koszt 16-bajtowego nagłówka sterty).

Można wydajniej napisać powyższe dane, wstępnie alokując funkcję Rezerwy String(), aby wstępnie przydzielić bufor. Lub przepisz go ponownie używając natywnych tablic znaków w C++.

+0

Sugestia z peterept działała idealnie na mój problem. Wstawiłem wiersz "encrypted.reserve (33);" w ramach deklaracji zmiennej. Przeszukałem internet pod kątem funkcji reserve() na arduino i znalazłem kilka wyjaśnień na ten temat: http://code.google.com/p/arduino/issues/detail?id=449 Dzięki za wspaniałą –

Powiązane problemy