2012-02-06 28 views
5

Tôi cố gắng ghép đầu ra mã hóa AES-256 thành chuỗi (để so sánh chuỗi này với Chuỗi được mã hóa được gửi từ điện thoại Android).Arduino: Sự cố và lỗi khi ghép chuỗi

Về cơ bản, kết hợp dường như hoạt động, nhưng sau một số lỗi chạy (các ký tự không đọc được, chuỗi ngắn hơn thay vì dài hơn) hoặc sự cố xảy ra. Nó có thể tái sản xuất, treo tại cùng một điểm chính xác sau khi khởi động lại.

Tôi đã trích xuất một số dòng mã Arduino minh họa sự cố. Nó thực hiện như sau:

  1. Tạo một số ngẫu nhiên và viết nó vào một mảng (hoạt động)
  2. mã hóa AES- mảng này (hoạt động)
  3. Xây dựng một đại diện HEX của mỗi chỉ số mảng (hoạt động)
  4. cONCATENATE các chỉ số vào một string (tai nạn)

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

Tôi đã tìm kiếm các diễn đàn, thử các cách khác nhau để nối (toán tử +, strcat). Tất cả đều có hiệu ứng tương tự. Tôi đọc rằng thư viện String có lỗi, cập nhật Arduino IDE thành 1.0.

Điều này đã khiến tôi bận rộn trong nhiều ngày, mọi trợ giúp đều được đánh giá cao,

Cảm ơn rất nhiều!

+0

chuỗi lớn như thế nào? – Anycorn

+0

Nó bắt đầu từ 0 và tăng lên 32 byte (mỗi vòng lặp thêm 2 byte hiển thị) –

Trả lời

3

Có thể bạn sắp hết bộ nhớ vì Arduino chỉ có một lượng nhỏ.

Kiểm tra số bộ nhớ bạn có free trong vòng lặp của mình.

Thủ phạm có thể là việc thực thi String (xem Arduino WString.cpp) đang sử dụng realloc(), và bộ nhớ của bạn có thể bị defregmented nặng với một hoặc hai chuỗi byte (mỗi chuỗi có chi phí tiêu đề 16 byte).

Bạn có thể viết lại hiệu quả hơn bằng cách phân bổ trước một hàm chuỗi dự trữ() để phân bổ trước bộ đệm. Hoặc viết lại nó bằng cách sử dụng mảng char C++ bản địa.

+0

Đề xuất từ ​​peterept hoạt động hoàn hảo cho vấn đề của tôi. Tôi đã chèn dòng "encrypted.reserve (33);" dưới tuyên bố biến. Tôi tìm kiếm trên Internet cho các chức năng dự trữ() trên arduino và tìm thấy một số lời giải thích về nó: http://code.google.com/p/arduino/issues/detail?id=449 Cảm ơn bạn tuyệt vời –

Các vấn đề liên quan