Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   In Binärdatei suchen (https://www.delphipraxis.net/84217-binaerdatei-suchen.html)

Ares 13. Jan 2007 14:14

Re: In Binärdatei suchen
 
Hallo!

Vielen Dank für das Beispiel! Ich habe es so abgeändert:

Zitat:

procedure TForm1.Button1Click(Sender: TObject);
const
BUFSIZE = 64 shl 10;
var stream: TStream;
test: string;
i: integer;

buffer: String;
chunk: Integer;
begin
stream := TFileStream.Create('D:\Datei.bin', fmOpenRead);
chunk := Max(BUFSIZE, stream.Size - stream.Position);
if chunk < Length(buffer)
then SetLength(buffer, chunk)
else SetLength(buffer, BUFSIZE);
stream.Read(buffer[1], chunk); //84068

for i := 1 to 10 do begin
test1 := test1 + IntToHex(ord(buffer[i]),2) + ' ';
end;

showMessage(test);

stream.Free;
end;
Was genau hat es mit der Zuteilung von chunk auf sich? Ich durchschaue leider nicht ganz, wofür das gut ist.

Ich habe folgende beobachtung gemacht:
Wenn ich das Programm so laufen lasse, werde mir mit showMessage wunderbar die ersten 10 Byte angezeigt (E0 32 98 00 00 00 00 00 00 00). Aber: Es sind die falschen! Wenn ich mir die Datei mit einem Hex-Editor anschaue kommt diese Bytefolge nirgendwo vor, besonders nicht am Dateianfang.

Wenn "stream.Read(buffer[1], chunk);" durch "stream.Read(buffer[1], ZAHL);" ersetze und mit verschiedenen Werten für ZAHL rumprobiere bekomme ich das Ergebnis:
ZAHL = 1 bis 84068 --> Es werden die korrekten Bytes angezeigt (D2 18 B4...)
ZAHL = 84068 bis 84072 --> Es kommt zu einer Exception
ZAHL = 84073 oder größer --> Das falsche Ergebnis wird angezeigt.

Das Ergebnis kann ich nicht wirklich deuten? Wie kommen die Zahlen zustande? Wo könnte der Fehler liegen?

Besten Dank!
Ares

marabu 13. Jan 2007 14:25

Re: In Binärdatei suchen
 
Hallo,

wenn deine Dateien doch riesig groß sind, dann möchtest du sie sicher portionsweise verarbeiten - chunk (maximal 64KB) ist die Portionsgröße und mein Code gehört in eine Schleife. Solange mindestens 64KB Restdaten gelesen werden können, wird der einmal allozierte Buffer benutzt, fällt der Rest unterhalb diese Größe, dann wird der Buffer redimensioniert.

Deine Experimente kann ich anhand deiner Angaben nicht so gut kommentieren, da müsstest du wirklich den richtigen Code zeigen. Ist allerdings der Buffer nach wie 64KB groß und du liest deutlich größere Mengen ein, dann überschreibst du angrenzende Speicherbereiche und das Ergebnis muss dich nicht wundern.

Freundliche Grüße

Hawkeye219 13. Jan 2007 15:38

Re: In Binärdatei suchen
 
Hallo Ares,

versuche es mal mit dieser Änderung:

Delphi-Quellcode:
// chunk := Max(BUFSIZE, s.Size - s.Position);
chunk := Min(BUFSIZE, s.Size - s.Position); // Min() statt Max()
SetLength(buffer, chunk);
s.Read(buffer[1], chunk);
Ein kleiner Fehler, der aber sehr schnell passiert. Man möchte eine maximale Puffergröße angeben, muß aber dazu die Funktion Min() benutzen. Die Fallunterscheidung habe ich entfernt - sie wird meiner Meinung nach nicht mehr benötigt.

Noch ein Hinweis: wenn der Suchstring mehrere Bytes enthält, befindet er sich eventuell nur zum Teil in einem Puffer und wird dann im nächsten fortgesetzt. Diesen Sonderfall mußt du bei der Untersuchung des Pufferinhalts berücksichtigen. Wie man so etwas prinzipiell angehen kann, findest du in diesem Thread.

Gruß Hawkeye

marabu 13. Jan 2007 16:26

Re: In Binärdatei suchen
 
Hallo Hawkeye,

danke für die Korrektur - ich ahnte, dass mein disclaimer nötig war ...

Freundliche Grüße

Christian Seehase 13. Jan 2007 16:42

Re: In Binärdatei suchen
 
Moin Jürgen,

als Vervollständigung der Vervollständigung ;-)

Zitat:

Zitat von juergen
Es gibt einen von MS dokumentierten Parameter für die Boot.ini -> /3GB
Das hebt die Beschränkung zumindest schonmal von 2 GB auf 3 GB, aber somit nur noch 1 GB für das OS.
Manchmal kann das hilfreich sein...

Vorausgesetzt die Anwendung ist so compiliert, dass sie das auch nutzen kann (was, AFAIK, mit Delphi nicht geht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz