Arduino: сбои и ошибки при объединении строк - PullRequest
6 голосов
/ 07 февраля 2012

Я пытаюсь объединить вывод шифрования AES-256 в строку (чтобы сравнить эту строку с зашифрованной строкой, отправленной с телефона Android).

По сути, конкатенация работает, но после нескольких запусков возникают ошибки (нечитаемые символы, строка становится короче, а не длиннее) или происходит сбой. Воспроизводимый, вылетает в той же точке после перезапуска.

Я извлек несколько строк кода Arduino, которые демонстрируют проблему. Это делает следующее:

  1. Создать случайное число и записать его в массив (работает)
  2. AES- кодировать этот массив (работает)
  3. Построить HEX-представление каждого индекса массива (работает)
  4. Конкатенация индексов со строкой (сбой)

#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
}

Я искал форумы, пробовал разные способы объединения (+ оператор, strcat). У всех были похожие эффекты. Я читал, что в библиотеке String была ошибка, обновил Arduino IDE до 1.0.

Это занимало меня несколько дней, любая помощь очень ценится,

Большое спасибо!

1 Ответ

4 голосов
/ 07 февраля 2012

Возможно, вам не хватает памяти, поскольку Arduino имеет только небольшое количество.

Проверьте, сколько памяти у вас есть свободно во время цикла.

Причиной может быть то, что реализация String (см. Arduino WString.cpp ) использует realloc (), и ваша память, вероятно, сильно дефрагментируется одной или двумя байтовыми строками (каждая из которых имеет стоимость заголовка кучи 16 байт).

Вы могли бы переписать вышеприведенное более эффективно, предварительно выделив функции String reserve () для предварительного выделения буфера. Или переписать его, используя собственные массивы символов C ++.

...