![]() |
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:
aber kein Befehl, um gleich ein Integer, Real oder String einzulesen.
Read(var Buffer; Count: Longint): Longint;
Hat jemand eine Idee? |
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; |
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 ... |
Re: Binärdatei auslesen
Zitat:
|
Re: Binärdatei auslesen
Zitat:
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 |
Re: Binärdatei auslesen
Zitat:
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. |
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. |
Re: Binärdatei auslesen
|
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; |
Re: Binärdatei auslesen
Moin Alex,
Zitat:
Du könntest also auch TFileStream verwenden. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr. |
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 by Thomas Breitkreuz