Ersteinmal mußt du verstehen, was Hexadezumal und Base64 eigentlich ist.
Bei Base64 hat jedes "kodierte" Zeichen 64 Werte, wärend es bei Hexadezimal nur 16 Werte sind.
Außerdem ist dabei natürlich der kodierte String länger ... mehr Zeichen, da ja weniger Daten pro Zeichen vorhanden sind.
Base64 = 28 Zeichen (4 Zeichen pro 3 Byte)
Hex = 40 Zeichen (2 Zeichen pro Byte, also 6 Zeichen pro 3 Byte)
Du hast jetzt versucht 64 Werte auf ein 16-Zeichen Array loszulassen, was natürlich schief laufen muß.
PS: Schalte mal die Bereichsprüfung in deinen Projektoptionen an.
(und schon wäre dir das Problem von selber aufgefallen
)
Und dann war natürlich der String zu kurz.
Delphi-Quellcode:
Class function TSHA1.toHex(Res: TSHA1Res): String;
Const HexTable: array[0..15] of Char = '0123456789ABCDEF';
Var A: packed array[0..19] of Byte absolute Res;
i: Integer;
Begin
SetLength(Result, 40);
Bor i := 0 to 19 do Begin
Result[i * 2 + 1] := HexTable[A[i] shr 4];
Result[i * 2 + 2] := HexTable[A[i] and 15];
End;
End;