AGB  ·  Datenschutz  ·  Impressum  







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

Binärdatei auslesen

Ein Thema von almisoft · begonnen am 28. Mai 2010 · letzter Beitrag vom 29. Mai 2010
Antwort Antwort
Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#1

Binärdatei auslesen

  Alt 28. Mai 2010, 10:37
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 Read(var Buffer; Count: Longint): Longint; aber kein Befehl, um gleich ein Integer, Real oder String einzulesen.

Hat jemand eine Idee?
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 10:42
Hallo,

Tja Delphi kaut dir in der Hinsicht halt nicht alles vor

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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#3

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 10:46
Und doch liebe ich sie beide, Java und Delphi
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 ...
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 11:02
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ß War anfangs auch kein großer Zeigerfan
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 17:43
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 17:51
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.
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#7

Re: Binärdatei auslesen

  Alt 28. Mai 2010, 23:25
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.
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

Re: Binärdatei auslesen

  Alt 29. Mai 2010, 08:47
noch was zum Java<>Delphi:

http://www.delphipraxis.net/internal...highlight=java
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#9

Re: Binärdatei auslesen

  Alt 29. Mai 2010, 11:06
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;
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Binärdatei auslesen

  Alt 29. Mai 2010, 13:06
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...
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


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 05:59 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