AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

FileStream to Buffer

Ein Thema von HPW · begonnen am 18. Aug 2021 · letzter Beitrag vom 19. Aug 2021
Antwort Antwort
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#1

FileStream to Buffer

  Alt 18. Aug 2021, 20:22
Delphi-Version: 7
Hallo,

Ich habe folgenden Code der schon tut was er soll.
Die Funktion HashBuf erwartet einen Buffer und meine Daten kommen aus einem Stream.
Ist der Code so in Ordnung oder gibt es andere (bessere) Methoden?

Code:
procedure TForm1.Button7Click(Sender: TObject);
 var
   DestStr : String;
   FStream : TFileStream;
   Size   : Integer;
   Buffer : TBytes;
begin
 FStream := TFileStream.Create(Edit3.Text,fmOpenRead);
 Size   := FStream.Size;
 SetLength(Buffer, Size);
 FStream.ReadBuffer(Pointer(Buffer)^, Size);
 HashBuf( HASH_SHA256, Buffer , Size , DestStr );
 Edit2.Text := DestStr;
 FStream.Free;
end;
Grüsse,
Hans-Peter
Hans-Peter
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
709 Beiträge
 
Delphi XE5 Professional
 
#2

AW: FileStream to Buffer

  Alt 18. Aug 2021, 20:32
Hallo Hans-Peter,
es ist wichtig, den PositionsZeiger des Streams vor dem Lesen immer auf die Startposition zu setzen:
FStream.Position:= 0; Sonst fängt es bei einer undefinierten (zufälligen) Position an, zu lesen.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (18. Aug 2021 um 20:34 Uhr)
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#3

AW: FileStream to Buffer

  Alt 18. Aug 2021, 20:44
Hallo,

Danke für den Hinweiss.

Sonst ist die Methode die richtige?

Grüsse,

Hans-Peter
Hans-Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: FileStream to Buffer

  Alt 18. Aug 2021, 22:23
Position:=0; ist hier nicht nötig, da nur einmal gelesen wird und zu Beginn, nach dem Create, die Position immer auf 0 steht. (außer beim Append)

Ja, geht so, so lange die Datei klein genug ist und immer in deinen virtuellen Speicher (2 GB) passt, sonst muß der Buffer kleiner sein und die Datei stückchenweise eingelesen werden.

Warum hast du keinen Ressourcenschutzblock verbaut?

Und ansonsten gibt es auch Streams, welche direkt einen "Buffer" eingebaut haben,
wie z.B. TMemoryStream und TBytesStream (ich glaub erst ab D2009 oder so).

Delphi-Quellcode:
// falls man HashBuf auch mit einem Pointer füttern kann, anstatt TBytes
FStream := TMemoryStream.Create;
try
  FStream.LoadFromFile(Edit3.Text);
  HashBuf(HASH_SHA256, FStream.Memory, FStream.Size, DestStr);
  Edit2.Text := DestStr;
finally
  FStream.Free;
end;
Und wie immer die Frage, warum so ein altes Delphi?
Denn Delphi-Referenz durchsuchenTHashSHA2 und Edit2.Text := THashSHA2.GetHashStringFromFile(Edit3.Text); .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Aug 2021 um 22:30 Uhr)
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#5

AW: FileStream to Buffer

  Alt 19. Aug 2021, 07:49
Hallo,

Nochmal Danke für den Tip.

>>Warum hast du keinen Ressourcenschutzblock verbaut?

Das hatte ich gestern auch schon nachträglich eingebaut.

Den TMemorystream-Tip finde ich dann auch noch viel eleganter als meinen Code. Werde testen ob die Hash Funktion das unterstützt.

D7 ist notwendig weil es um die Pflege eines umfangreichen Alt-Systems handelt, welches nicht mehr umgetellt werden soll/kann.
Tot-gesagte leben halt länger!

Grüsse,

Hans-Peter
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#6

AW: FileStream to Buffer

  Alt 19. Aug 2021, 08:05
Hallo,

>>Den TMemorystream-Tip finde ich dann auch noch viel eleganter als meinen Code. Werde testen ob die Hash Funktion das unterstützt.

Hat funktioniert!

Grüsse,
Hans-Peter
Hans-Peter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz