Hash wert vom Array Problem

Gast #5839432
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, (const unsigned char*)string + ii, 1);
4
  SHA1Final((unsigned char *)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
char const string[] = "abc";
angegeben.
Ich weiß aber leider nicht, wie ich das jetzt umschreiben muss, um einen 
normalen array zu benutzen.

hatte
1
const uint8_t values[] = {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.
Gast
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.
Gast
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.
Gast
SHA1Update arbeitet mit Blöcken. Also Zeiger auf Block + Länge eingeben. 
Keine Einzelwerte. Warum nicht einfach dem Beispiel auf github folgen?
Gast
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.
Gast
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.

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.