Vergleich doch mal, ob LFile.Size und Length(TBytes(LFile.Memory)) exakt gleich groß sind.
Das ist ja interessant, die sind tatsächlich unterschiedlich???!
Beispiel:
Dateigröße im System: 296759
LFile.Size: 296759
Length(TBytes(LF..)): 327684
Alternativ TBytesStream verwenden? Dann mit LFile.Bytes (von Typ TBytes) übergeben?
Mit TByteStream und
LSHA1.Update(LFile.Bytes, LFile.Size);
Scheint es zu funktionieren, auch hier ist
Length(LFiles.Bytes) <> LFile.Size
, aber soweit ich das verstehe entspricht Length(LFiles.Bytes) LFiles.Capacity und die kann natürlich größer sein!
Das erklärt dann auch gleich die Zahlen im ersten Fall! Ich nehme sogar an, das im ersten Fall (casten) ein TArray<Byte> erzeugt wird und die Daten dahin umkopiert werden, bevor die Updatemethode aufgerufen wird.
Bleibt noch festzuhalten, dass unter 10.1 die folgende Methode aufgerufen wurde:
Delphi-Quellcode:
procedure THashSHA1.Update(const AData: TBytes; ALength: Cardinal = 0);
var
Len: Integer;
begin
if ALength = 0 then
Len := Length(AData)
else
Len := ALength;
Update(PByte(AData), Len);
end;
Und in 10.2.1 diese:
Delphi-Quellcode:
procedure THashSHA1.Update(const AData; ALength: Cardinal);
begin
Update(PByte(@AData), ALength);
end;
und mit dem PByte(@AData) greifen wir nicht mehr auf unseren Buffer zu, sondern auf den Speicher wo AData liegt...