Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Binärdatei auslesen (https://www.delphipraxis.net/151695-binaerdatei-auslesen.html)

almisoft 28. Mai 2010 09:37


Binärdatei auslesen
 
Hallo,

ich möchte eine Binärdatei (binary property list, wird von Safari benutzt) auslesen und verarbeiten, deren Aufbau mir bekannt ist.
Ich habe ein Java-Programm, in dem das schon alles implementiert ist. Nun möchte ich das in Delphi umschreiben.
Im Java-Programm wird z.B. ein Integer-Wert mit RandomAccessFile.readInt ausgelesen.
Nun suche ich zum readInt ein Äquivalent in Delphi.

Ich habe erstmal ein TMemoryStream genommen, weil man da auch wahlfreien Zugriff hat.
Nur gibt in in TMemoryStream nur ein
Delphi-Quellcode:
Read(var Buffer; Count: Longint): Longint;
aber kein Befehl, um gleich ein Integer, Real oder String einzulesen.

Hat jemand eine Idee?

Neutral General 28. Mai 2010 09:42

Re: Binärdatei auslesen
 
Hallo,

Tja Delphi kaut dir in der Hinsicht halt nicht alles vor :stupid:

Delphi-Quellcode:
var ms: TMemoryStream;
    int: Integer;
begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile(<Datei>);
    ms.Read(int,SizeOf(Integer));
    ShowMessage(Format('Die eingelesene Zahl lautet: %d',[int]));
  finally
    ms.Free;
  end;
end;

almisoft 28. Mai 2010 09:46

Re: Binärdatei auslesen
 
Und doch liebe ich sie beide, Java und Delphi :-D
Vielen Dank, hätte ich mit ein wenig Nachdenken auch drauf kommen können.
Aber trotz der vielen Jahre der Programmiererei bin ich mit dem Zeigersch... noch nicht warm geworden ...

Neutral General 28. Mai 2010 10:02

Re: Binärdatei auslesen
 
Zitat:

Zitat von almisoft
Aber trotz der vielen Jahre der Programmiererei bin ich mit dem Zeigersch... noch nicht warm geworden ...

Die Sache ist nicht so schlimm wie sie erstmal scheint. Und wenn man den Bogen mal raus hat, dann machts sogar Spaß :mrgreen: War anfangs auch kein großer Zeigerfan :mrgreen:

p80286 28. Mai 2010 16:43

Re: Binärdatei auslesen
 
Zitat:

Zitat von Neutral General
Hallo,

Tja Delphi kaut dir in der Hinsicht halt nicht alles vor :stupid:

Delphi-Quellcode:
var ms: TMemoryStream;
    int: Integer;
begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile(<Datei>);
    ms.Read(int,SizeOf(Integer));
    ShowMessage(Format('Die eingelesene Zahl lautet: %d',[int]));
  finally
    ms.Free;
  end;
end;

Ich bin zu blöd dazu, wo ist da ein Zeiger?

Und wenn die Struktur der Daten bekannt ist (record?) dann würde ich nicht int für int lesen sondern gleich ein ganzes record.

Gruß
K-H

H4ndy 28. Mai 2010 16:51

Re: Binärdatei auslesen
 
Zitat:

Zitat von p80286
Ich bin zu blöd dazu, wo ist da ein Zeiger?

Die Read-Methode vom Stream frist alles von Zeigern bis Variablen, arbeitet Intern aber nur mit Zeigern.
Ausserdem ist ja die Arbeitsweise die gleiche, nur dass man den "Komfort" hat nicht immer @Variable machen zu muessen.

Uebrigens bin ich auch fuer Record-Methode, das spart ne Menge arbeit wenn die Daten struktiert (ohne variable Feldgroessen) vorliegen.

almisoft 28. Mai 2010 22:25

Re: Binärdatei auslesen
 
Die Daten in der Binärdatei sind teils sequenziell gespeichert und man muss erst einmal entschlüsseln, was es für ein Datentyp ist. Daher kann man es nicht so einfach mit records machen.
Wenn ich das java-Programm in Delphi-Pascal umgewandelt habe, kann ich es ja hier veröffentlichen.

himitsu 29. Mai 2010 07:47

Re: Binärdatei auslesen
 
noch was zum Java<>Delphi:

http://www.delphipraxis.net/internal...highlight=java

almisoft 29. Mai 2010 10:06

Re: Binärdatei auslesen
 
Danke, ich hatte mich auch gewundert, dass ein RandomAccessFile.readInt unter Java einen anderen Wert brachte als ein TMemoryStream.Read unter Delphi.

Ich habe mir mit einer kleinen Erweiterung TMemoryEx beholfen:

Delphi-Quellcode:
type TMemoryStreamEx=class(TMemoryStream)
     public
       function ReadByte:integer;
       function ReadInt:integer;
       function ReadLong:int64;
       function ReadShort:integer;
       function ReadString(Length:integer):string;
     end;

function ChangeEndian32(i:integer):integer; register;
asm
  bswap EAX
end;

procedure ChangeEndian64(P: Pointer); register;
asm
  mov EDX, [EAX]
  bswap EDX
  mov EBX, [EAX + $04]
  bswap EBX
  mov [EAX], EBX
  mov [EAX + $04], EDX
end;

function TMemoryStreamEx.ReadByte:integer;
var b:byte;
begin
  Read(b,SizeOf(byte));
  Result:=b;
end;

function TMemoryStreamEx.ReadInt:integer;
begin
  Read(Result,SizeOf(integer));
  Result:=ChangeEndian32(Result);
end;

function TMemoryStreamEx.ReadLong:int64;
begin
  Read(Result,SizeOf(int64));
  ChangeEndian64(@Result);
end;

function TMemoryStreamEx.ReadShort:integer;
begin
  Read(Result,2);
  Result:=Swap(Result);
end;

function TMemoryStreamEx.ReadString(Length:integer):string;
begin
  SetLength(Result, Length);
  ReadBuffer(Pointer(Result)^, Length);
end;

Christian Seehase 29. Mai 2010 12:06

Re: Binärdatei auslesen
 
Moin Alex,

Zitat:

Ich habe erstmal ein TMemoryStream genommen, weil man da auch wahlfreien Zugriff hat.
Wahlfreien Zugriff hast Du bei allen von TStream abgeleiteten Klassen, da diese schon die Eigenschaft Position enthält, mit der man innerhalb des Streams beliebig positionieren kann.
Du könntest also auch TFileStream verwenden.

Zitat:

Aber trotz der vielen Jahre der Programmiererei bin ich mit dem Zeigersch... noch nicht warm geworden ...
Wobei hier, wie p80286 schon sagte, gar keine Zeiger verwendet werden... ;-)


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