Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datei binär lesen und schreiben (https://www.delphipraxis.net/100779-datei-binaer-lesen-und-schreiben.html)

MisterNiceGuy 3. Okt 2007 20:01


Datei binär lesen und schreiben
 
Hi, ich suche eine Funktion um eine Datei / einen Datenstream binär auszulesen und diesen "Binär-String" wieder in eine Atei zu schreiben.

Hatte das schonmal irgendwo gefunden, aber da hatte ich wohl noch bessere Augen ;)

Vielen Dank schonmal

Dax 3. Okt 2007 20:04

Re: Datei binär lesen und schreiben
 
Was meinst du mit "binär lesen"?

MisterNiceGuy 3. Okt 2007 20:12

Re: Datei binär lesen und schreiben
 
Also ich möchte eine Datei als String aus Nullen und Einsen darstellen.

Und eben wieder einen Solchen String als Datei schreiben.

markusj 3. Okt 2007 21:04

Re: Datei binär lesen und schreiben
 
Als (File)Stream byteweise lesen und die Bytes dann in ihre einzelnen Bits zerlegen ... einen direkten Zugriff auf die Bits gibt man dir nicht ohne Mehrarbeit ...

mfG
Markus

Nachtrag: Ich könnte mir keinen effektiveren Weg vorstellen, den Arbeitsspeicher bis zum Bersten zu Füllen, ohne davon einen Nutzen zu haben ... auf 1 Datenbyte brauchst du 8 Byte für deinen String, da is der RAM ratz-fatz voll ... ich würde immer nur einen Ausschnitt umwandeln (um genau zu sein, ein Byte^^)

MisterNiceGuy 4. Okt 2007 09:38

Re: Datei binär lesen und schreiben
 
Hi also aus einem Stream lese ich mit Read(buffer,int) aber wie lese ich damit den kompletten Stream?
Ich suche also sowas:

Delphi-Quellcode:
For i := 0 to length(FileStream) do
  FileStream.Read(mybuffer,i);

guidok 4. Okt 2007 10:22

Re: Datei binär lesen und schreiben
 
Naja, TStringList hat z.B. die Procedure ReadFromStream und kann damit den gesamten Stream in einen String lesen (byteweise).

Ansonsten kannst du den Stream mit Read byteweise in einer Schleife auslesen, das gelesene Byte in dein gewünschtes Format wandeln und z.B. in irgendeinen Puffer schreiben.

Zudem:

function Read(var Buffer: Type; Count: Integer): Integer; override;

Die Funktion Read erwartet auch die Angabe von Count, was der Anzahl der Byte entspricht, die aus dem Stream gelesen wird. Steht genau so in der Hilfe.

markusj 4. Okt 2007 11:20

Re: Datei binär lesen und schreiben
 
Ich würde ähnlich wie mein Vorredner, entweder eine Klasse außenrum packen oder eine von TFile-/TMemoryStream ableiten.
Im übrigen würde ich wie bereits erwähnt, immer nur den Teil lesen, den du brauchst.

Leite doch einfach ein TFileStream ab, ändere die Methode Read so, dass du via inherited ein Byte liest und dann einen String mit 8 Stellen zurückgibst ...
(Nicht getestet:)

Delphi-Quellcode:
function read(var Buffer : String, byteCount : Integer) : Integer; //als overload deklarieren
 var
  i, Buf, count : byte;
 begin
 result := 0;
 Buffer := 0;
 repeat
  count := read(buf, 1)
  if count = 1 then
   begin
   inc(result);
   i := 1;
   while buf <> 0 do
    begin
    if odd(buf) then
     Buffer := Buffer+'1'
     else Buffer := Buffer+'0';
    inc(i);
    buf:= buf shr 1;
    end;
   while i <= 8 do
    begin
    Buffer := Buffer+'0';
    inc(i);
    end;
   end
   else break; //ausstiegsvariante 1 : wir sind am ende des streams
  until result = byteCount; //variante 2 : wir haben gelesen was zu lesen ist
 end;
mfG
Markus

Reinhard Kern 4. Okt 2007 15:07

Re: Datei binär lesen und schreiben
 
Zitat:

Zitat von guidok
Naja, TStringList hat z.B. die Procedure ReadFromStream und kann damit den gesamten Stream in einen String lesen (byteweise).
....

Bei binären Daten ist eine TStringlist nichts als barer Unsinn.

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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