Ich bin dir wirklich sehr dankbar für alles. Aber leider funktioniert dein Code bei mir nicht.
Für folgendes erhalte ich auch nur Salat
Delphi-Quellcode:
// _TEST_TEST_D36E844639D6B4B9ADAF9A11C2ABF841CCE43E94C57539C03CC9524545DD8E8D
ShowMessage( TEncoding.ANSI.GetString(
GetSHA1HashFromFile(aFileName, [0, -64])
)
);
Du machst einen Fehler SHA1 liefert 160Bit/20Byte Werte. Du musst also
hash := GetSHA1HashFromFile( filename, [0,-21] );
berechnen, wenn du den Hash Wert des Files ohne den angehängten (20 Byte) Hash Wert berechnen willst.
So geht's:
SHA1 ans Ende des Files schreiben durch Aufruf von
procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );
Delphi-Quellcode:
procedure HashAnsEndeDesFilesSchreiben( filename : string; hash : TBytes );
var f : TFileStream;
begin
f := TFileStream.Create( filename, fmOpenWrite );
try
f.Position := f.Size;
f.Write( hash[0], length( hash ) );
finally
f.Free;
end;
end;
procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );
var hash, hash2 : TBytes;
begin
hash := System.hash.THashSHA1.GetHashBytesFromFile( filename ); // Delphi system.hash
// hash2 := GetSHA1HashFromFile( filename , [] ); // oder wir verwenden "unsere" SHA1 Funktion
HashAnsEndeDesFilesSchreiben( filename, hash );
end;
Den Hashwert am Ende des Files überprüfen:
function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;
Delphi-Quellcode:
function LiesHashAmEndeDesFiles( const filename : string; len : integer ) : TBytes;
var f : TFileStream;
begin
f := TFileStream.Create( filename, fmOpenRead );
try
f.Position := f.Size - len ;
SetLength( Result, len );
f.Read( Result, len );
finally
f.Free;
end;
end;
function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;
var hashAmFileEnde, hash : TBytes;
begin
hash := GetSHA1HashFromFile( filename, [0,-21] ); // SHA1 erzeugt 160bit (20Byte) Werte
hashAmFileEnde := LiesHashAmEndeDesFiles( filename, 20 );
Result := CompareMem( hash, hashAmFileEnde, 20 );
end;
Testen:
Delphi-Quellcode:
procedure pruefen_SHA1;
var filename : string;
allesok : boolean;
begin
filename := 'C:\Users\Michael\Desktop\1GB.txt';
// Ans Fileende schreiben:
SchreibeSHA1HashAnsEndeDesFiles( filename );
// Prüfen, ob der HashWert OK ist:
allesok := PruefeSHA1HashAmEndeDesFiles( filename );
ShowMessage( 'Check File : ' + allesok.ToInteger.ToString );
end;