Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anfänger Frage zu Byteweisem auslesen (https://www.delphipraxis.net/43381-anfaenger-frage-zu-byteweisem-auslesen.html)

dragi 3. Apr 2005 01:19


Anfänger Frage zu Byteweisem auslesen
 
Hallo,

ich hab Probleme die ganzen Bespiele mit dem auslesen von Binärdateien zu verstehen. Also, die Datei lese ich in einen Stream ein. Aber wie navigiere ich jetzt darin? Ich hab eine Beschreibung wie die Datei aufgebaut ist darin steht z.B. das die ersten 4Byte ein Plaintext sind, die nächten 4 Byte sind ein Int und dann folgen diverse stellen die 1 Byte sind. Wenn ich jetzt z.B das Integer haben möchte, wie navigiere ich jetzt genau an die Stelle und hole mir genau diese 4Byte?
Kann mir das nochmal jemand erklären?

Vielen Dank

Dragi ...der hofft das mal zu verstehen :)

Sharky 3. Apr 2005 01:28

Re: Anfänger Frage zu Byteweisem auslesen
 
Hai dragi,

in einem Stream kannst Du deine "Position" mit TStream.Posion := xxx setzen.
Um jetzt etas aus dem Strem zu lesen kannst Du mir ja mal Delphi-Referenz durchsuchen.ReadBuffer ansehen.

So könnte das dann aussehen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  myStream : TStream;
  i : Integer;
begin
  myStream.Position := 3; // Auf das 4. Byte setzen.
  myStream.ReadBuffer(i , SizeOf (i)); // In "i" lesen.
end;

Pr0g 3. Apr 2005 01:31

Re: Anfänger Frage zu Byteweisem auslesen
 
Versuchs mal so:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  FS: TStream;
  i: Integer;
begin
  FS := TFileStream.Create('datei.dat', fmOpenRead);
  try
    FS.Position := 3;
    FS.ReadBuffer(i, 4);
  finally
    FS.Free;
  end;
end;
Edit: Hm, zu lahm :roll:

bigg 3. Apr 2005 01:50

Re: Anfänger Frage zu Byteweisem auslesen
 
Hol dir erstmal die Dateigröße, denn die benötigst du zum Auslesen der Datei.
Anschließend kannst du die Datei gepuffert auslesen.

dragi 3. Apr 2005 13:43

Re: Anfänger Frage zu Byteweisem auslesen
 
@bigg

warum muss ich denn die Dateigrösse haben? Ich hab eine Aufstellung in der nacheinander Beschreiben ist wie die Datei aufgebaut ist in Byte. Also: 4Byte Key, 4Byte Int, 1Byte Byte, 1Byte BYte, 4Byte Int, ... etc. Muss ich dann trotzdem die gesamtgrösse haben?

SirThornberry 3. Apr 2005 13:45

Re: Anfänger Frage zu Byteweisem auslesen
 
die gesammtgröße brauchst du nicht wirklich, höchstens um abzuprüfen ob die datei wirklich groß genug ist und du nicht übers dateiende hinaus liest

dragi 3. Apr 2005 18:34

Re: Anfänger Frage zu Byteweisem auslesen
 
Hallo,

ich habe es jetzt hinbekommen, aber ein kleines Problem habe ich noch. Kann es sein das der noemale PC/Delphi alles als little Endian speichert? Also Integer und so?

Wenn ich jetzt

Code:
  FS.ReadBuffer(i, 4);
mache erhalte ich zwar einen Wert aber ich müsste eigentlich den Binärwert der 4 Bytes umkehren?! Ich weiss genau das an einer bestimmten Stelle der Integer Wert 1 rauskomme müsste, ich erhalte aber 16777216 was in Binärere Schreibweise 1000000000000000000000000 gibt. Wenn ich das jetzt umkehre habe ich genau 1. Alles Integer Werte haben so komische Ergebnisse obwohl ich an der richtigen Stelle auslese. Wie kann ich denn jetzt das ausgelesene umkehren?

Vielen Dank

Dragi

Christian Seehase 3. Apr 2005 19:08

Re: Anfänger Frage zu Byteweisem auslesen
 
Moin Dragi,

Du könntest die vier Byte einzeln auslesen, und dann in umgekehrter Reihenfolge wieder zusammensetzen, oder Du liest sie in der Reihenfolge aus wie sie in der Datei stehen, und überträgst sie dann entsprechend.

Ein "Trick" wäre es für das Einlesen einen varianten Record zu verwenden:

Delphi-Quellcode:
// nur das Wesentliche, das drumherum fehlt
type
  TcsBigEndian = packed record
    case byte of
      0 : (abRead : array [1..4] of byte;);
      1 : (dwResult : DWORD);
  end;

var
  beWork  : TcsBigEndian;

begin
  fs.Read(beWork.abRead[1],4); // in richtiger Reihenfolge gelesen
  ShowMessage(IntToStr(beWork.dwResult));
end;
Ungetestet, müsste aber funktionieren.

dragi 4. Apr 2005 12:27

Re: Anfänger Frage zu Byteweisem auslesen
 
Also entweder hab ich es nciht verstanden oder es funktioniert nicht. Ich bekomme die gleiche falsche Zahl raus :(

Irgendwie müsste man doch diese 4 Byte in umgekehrter Reihenfolge in den Speicher schreiben und dann diesen Breich auslesen und einem Integer zuweisen. Aber wie macht man sowas???

Gruss

Dragi

Christian Seehase 4. Apr 2005 19:02

Re: Anfänger Frage zu Byteweisem auslesen
 
Moin Dragi,

es funktioniert nicht :gruebel:

Aber so geht's:

Delphi-Quellcode:
    fs.Read(beWork.abRead[4],1);
    fs.Read(beWork.abRead[3],1);
    fs.Read(beWork.abRead[2],1);
    fs.Read(beWork.abRead[1],1);


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.
Seite 1 von 2  1 2      

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