Guten morgen,
ich möchte gerne von einem Bereich im Flash den HASH-Wert (SHA1)
berechnen.
Dazu habe ich bei Github https://github.com/clibs/sha1 gefunden.
Am wichtigsten sind ja nur die Funktionen
1
SHA1Init(&ctx);
2
for(ii=0;ii<len;ii+=1)
3
SHA1Update(&ctx,(constunsignedchar*)string+ii,1);
4
SHA1Final((unsignedchar*)result,&ctx);
5
result[20]='\0';
Jetzt habe ich im Flash aber keine String-werte stehen, sondern normale
uint8.
Im Beispiel ist der string mit
1
charconststring[]="abc";
angegeben.
Ich weiß aber leider nicht, wie ich das jetzt umschreiben muss, um einen
normalen array zu benutzen.
hatte
1
constuint8_tvalues[]={0x01,0x02,0x03,0x00}
bekomme ich die Meldung
Error message from debugger back end:
Cannot access memory at address 0x1
Das ganze mache ich in C in Eclipse.
Hat jemand einen rat, was ich anders machen muss? Wenn das Funktioniert,
wäre mein nächster Schritt den array values wegzu machen und direkt
werte vom FLASH zu lesen.
Frank schrieb:> SHA1Update(&ctx, (const unsigned char*)string + ii, 1);
Diesen habe ich geändert in
SHA1Update(&ctx, (const unsigned char*)values[ii], 1);
Frank schrieb:> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);
Das ist falsch.
Was für ein Controller ist das denn?
Frank schrieb:> Error message from debugger back end:> Cannot access memory at address 0x1
Das hat vermutlich nichts mit deinem Problem zu tun.
Frank schrieb:> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);
Versuchs mal mit
SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);
Ansonsten behandelt du den Zahlenwert des Arrayeintrags als Adresse.
c0s schrieb:> Versuchs mal mit> SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);
Ist identisch zum Originalen
Frank schrieb:> SHA1Update(&ctx, (const unsigned char*)string + ii, 1);
Wobei ich letzteres schöner finde. Warum eigentlich nicht einfach
1
SHA1Update(&ctx,string,len);
uint8_t ist doch wahrscheinlich eh identisch zu unsigned char.
Dr. Sommer schrieb:> c0s schrieb:>> Versuchs mal mit>> SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);>> Ist identisch zum Originalen
Natürlich ist es das. Die Frage war ja wie man das auf uint8_t
umschreibt, damit es noch das gleiche tut. Sein erster Ansatz dazu war
ja nur fast richtig, daher die korrigierte Version von mir.
Frank schrieb:> const uint8_t values[] = {0x01, 0x02, 0x03, 0x00}Frank schrieb:> Diesen habe ich geändert in> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);Frank schrieb:> Error message from debugger back end:> Cannot access memory at address 0x1
Falsch daran war, das er versucht hat den Eintrag an ii-ter Stelle aus
dem values Array als Pointer an die Funktion übergeben hat.
(const unsigned char*)values[ii] entspricht (const unsigned
char*)(values[ii]), weshalb erst der Eintrag an ii-ter Stelle
dereferenziert wird und das Ergebnis gecastet. Nimmt man als Beispiel
mal an das ii = 0 ist, steht bei der Ausführung sozusagen im Code
SHA1Update(&ctx, (const unsigned char*)0x01, 1);
Was dann zur geposteten Fehlermeldung führt.
PS.: Ich gehe davon aus das die SHA1Update Funktion versucht auf den
übergebenen Speicher zuzugreifen und damit das zweite Argument zu
dereferenzieren.
c0s schrieb:> Falsch daran war, das er versucht hat den Eintrag an ii-ter Stelle aus> dem values Array als Pointer an die Funktion übergeben hat.
Ja, aber nicht im Original! Erst seine "Korrektur" hat es
verschlimmbessert. Das Original ist korrekt.
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.