• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z funkcjami
#1
Witam.

Na wstępie powiem tylko że programuję praktycznie we wszystkim poza C i C++, nie jestem przezwyczajony do niskiego poziomu i nie mam zielonego pojęcia co tu się dzieje, po 3 dniach się poddałem i proszę o pomoc ;/



Mam taki kod:



Cytat:  Sha256.init();
  Sha256.print("qwer");
  uint8_t* hash = Sha256.result();
  char hashStr[64];
  formatToHEX(hash, hashStr);
  Serial.println(String(hashStr));

  Sha256.init();
  Sha256.print("asdf");
  uint8_t* hash2 = Sha256.result();
  char hashStr2[64];
  formatToHEX(hash2, hashStr2);
  Serial.println(String(hashStr2));




Funkcja formatToHex:





Cytat:void formatToHEX(uint8_t* hash, char* chars) {
  uint8_t t = 0;
  for (int i = 0; i < 32; i++) {
    chars[t] = (char)pgm_read_byte(hexMap + (hash[i] >> 4));
    t++;
    chars[t] = (char)pgm_read_byte(hexMap + (hash[i] & 0xf));
    t++;
  }
}




Kod (w sumie pierwsza połowa) ma za zadanie wyliczyć hash słowa "qwer" i to działa jako-tako.

Po hashu na serial monitorze pokazuje mi się kilka artefaktów:



Cytat:f6f2ea8f45d8a057c9566a33f99474da2e5c6a6604d736121650e2730c6fb0a3 ⸮ 3 N N ⸮ y
powinno być:

Cytat:f6f2ea8f45d8a057c9566a33f99474da2e5c6a6604d736121650e2730c6fb0a3




Ale sam hash jest poprawny.



Gdy dorzucę niżej drugi blok z hashowaniem kolejnego słowa "asdf" to teoretycznie pod tym hashem powinien się pojawić kolejny, tym razem słowa "asdf" czyli powinno być tak:
Cytat:f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b
f6f2ea8f45d8a057c9566a33f99474da2e5c6a6604d736121650e2730c6fb0a3
a jest tak:

Cytat:f6f2ea8f45d8a057c9566a33f99474da2e5c6a6604d736121650e2730c6fb0a3 ⸮ 3 N N ⸮ y
f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13bf6f2ea8f45d8a057c9566a33f99474da2e5c6a6604d736121650e2730c6fb0a3

Czyli zupełnie jakby zmienna hashStr łączyła się ze zmienną hashStr2. Bez sensu...
Funkcja SHA256 jest w pełni sprawna, bo gdy zrobię tak:

Cytat:  Sha256.init();
  Sha256.print("qwer");
  uint8_t* hash = Sha256.result();
  for (int i = 0; i < 32; i++) {
          Serial.print((char)pgm_read_byte(hexMap + (hash[i] >> 4)));
          Serial.print((char)pgm_read_byte(hexMap + (hash[i] & 0xf)));
  }

  Sha256.init();
  Sha256.print("asdf");
  uint8_t* hash2 = Sha256.result();
  for (int i = 0; i < 32; i++) {
          Serial.print((char)pgm_read_byte(hexMap + (hash2[i] >> 4)));
          Serial.print((char)pgm_read_byte(hexMap + (hash2[i] & 0xf)));
  }

To wszystko wyświetla się poprawnie. 2 hashe w osobnych linijkach bez żadnych artefaktów.
Może mi ktoś naprostować co robię źle?

Jeszcze co do tych artefaktów to rpzecież mam matrycę char która ma 64 pozycje i te 64 pozycje są wypełnione, więc skąd do h biorą się te artefakty...?

Dzięki za wasz czas Wink
 
Odpowiedź
#2
Nie czyścisz "hashStr" tak na moje oko .. W void formatToHEX(uint8_t* hash, char* chars) powinieneś wyczyścić stringa przed użyciem.

Bo sama deklaracja

char hashStr2[64];

Nie czyści... Rezerwuje tylko obszar w pamięci gdzie mogą być śmieci..
Zobacz tak

Sha256.init();
Sha256.print("qwer");
uint8_t* hash = Sha256.result();
char hashStr[64] ="";
formatToHEX(hash, hashStr);
Serial.println(String(hashStr));

Sha256.init();
Sha256.print("asdf");
uint8_t* hash2 = Sha256.result();
char hashStr2[64] ="";
formatToHEX(hash2, hashStr2);
Serial.println(String(hashStr2));

Albo użyć zmienna.clear();
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(01-11-2020, 10:51)Jarewa0606 napisał(a): Nie czyścisz "hashStr" tak na moje oko ..  W void formatToHEX(uint8_t* hash, char* chars) powinieneś wyczyścić stringa przed użyciem.

Bo sama deklaracja

  char hashStr2[64];

Nie czyści...  Rezerwuje tylko obszar w pamięci gdzie mogą być śmieci..
Zobacz tak

  Sha256.init();
  Sha256.print("qwer");
  uint8_t* hash = Sha256.result();
  char hashStr[64] ="";
  formatToHEX(hash, hashStr);
  Serial.println(String(hashStr));

  Sha256.init();
  Sha256.print("asdf");
  uint8_t* hash2 = Sha256.result();
  char hashStr2[64] ="";
  formatToHEX(hash2, hashStr2);
  Serial.println(String(hashStr2));

Albo  użyć zmienna.clear();
Więc pogrzebałem trochę i doszedłem do tego, że trzeba char arraye zakańczać NULLem, więc zmieniłem funkcję tak:
Cytat:void formatToHEX(uint8_t* hash, char* chars) {
  uint8_t t = 0;
  for (int i = 0; i < 32; i++) {
    chars[t] = (char)pgm_read_byte(hexMap + (hash[i] >> 4));
    //chars[t+1] = '\0';
    chars[t+1] = (char)pgm_read_byte(hexMap + (hash[i] & 0xf));
    //chars[t+2] = '\0';
    t+=2;
  }
  chars[64] = '\0';
}

Działa, ale nie wydaje mi się to poprawne bo chars[] ma pozycje od 0 do 63 a ja ustawiam na NULL pozycję 64, więc naruszam jakiś inny obszar pamięci, tak? Czy powinienem zmienić rozmiar tablicy na 65 czy może to co robię jest okej? Dlaczego w ogóle muszę robić to manualnie?
 
Odpowiedź
#4
"a ja ustawiam na NULL pozycję 64"

w której linijce?? bo ja nic takiego nie widzę..

Gdyby byla to tablica nie string to też bym powiedział że nie dajesz końca stringu ale ja się tam nie znam na stringach..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(01-11-2020, 17:04)Jarewa0606 napisał(a): "a ja ustawiam na NULL pozycję 64"

w której linijce?? bo ja nic takiego nie widzę..

Gdyby byla to tablica nie string to też bym powiedział że nie dajesz końca  stringu ale ja się tam nie znam na stringach..
chars[64] = '\0';
to jest tablica
 
Odpowiedź
#6
A teraz widzę Wink Nie naruszasz obszaru pamięci, a musisz manualnie bo masz konwersje char* do char[]
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości