AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In Binärdatei suchen

Ein Thema von Ares · begonnen am 13. Jan 2007 · letzter Beitrag vom 13. Jan 2007
Antwort Antwort
Seite 2 von 2     12   
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#11

Re: In Binärdatei suchen

  Alt 13. Jan 2007, 15:14
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: In Binärdatei suchen

  Alt 13. Jan 2007, 15:25
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#13

Re: In Binärdatei suchen

  Alt 13. Jan 2007, 16:38
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: In Binärdatei suchen

  Alt 13. Jan 2007, 17:26
Hallo Hawkeye,

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

Freundliche Grüße
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: In Binärdatei suchen

  Alt 13. Jan 2007, 17:42
Moin Jürgen,

als Vervollständigung der Vervollständigung

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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:45 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