AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Dynamische Arrays vom Type Byte in Verbindung mit TFileStream
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Arrays vom Type Byte in Verbindung mit TFileStream

Ein Thema von ObeY · begonnen am 16. Nov 2013 · letzter Beitrag vom 25. Nov 2013
 
ObeY

Registriert seit: 3. Jun 2004
7 Beiträge
 
Delphi 5 Enterprise
 
#1

Dynamische Arrays vom Type Byte in Verbindung mit TFileStream

  Alt 16. Nov 2013, 13:20
Hallo zusammen,
ich habe ein Problem mit Dynamische Arrays vom Type Byte in Verbindung mit dem Lesen eines TFileStreams.
Ich benutze Delphi 5 und habe die Testdatei hier mit hochgeladen.

Nach dem öffnen einer Binärdatei mittels TFileStream versuche ich diese in seine Bestandteile zu zerlegen.
Dazu lese ich die ersten 9 Bytes ein und speichere Sie in ein Statisches Array des Types Byte.
Das funktioniert auch.

Das 6 und 7 Byte multipliziert mit dem 8 und 9 Byte ergibt dann die Anzahl an Bytes die danach eingelesen werden sollen.
Dazu verwende ich dann mein dynamisches Arrays und setze die Länge.
Am Ende lese ich dann exakt soviele Bytes wie in das dynamische Array reinpassen würden was zur Folge hat, dass eine Exception ausgelöst wird und ich weiß nicht weshalb.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
Var
   floFStream : TFileStream;
   a : Array [ 1 .. 9 ] of byte;
   b : Array of byte;
   breite,hoehe : Integer;
   l : Integer;

begin
   mpoOut.Clear;
   OpenDialog1.InitialDir := zgvExec;
   if Not OpenDialog1.Execute Then
      Exit;
   floFStream := TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite);
   Try
      floFStream.ReadBuffer(a,9);
      breite := a[6] + a[7]*256; // = 112
      hoehe := a[8] + a[9]*256; // = 112

      l := breite * hoehe; // = 12544
      SetLength(b,l);   
      ShowMessage( IntToStr(High(b) )); // = 12543 da dynamische Arrays mit dem Index 0 beginnen
      floFStream.ReadBuffer(b,l);    // Exception: Stream-Read-Fehler.
   Finally
      floFStream.Free;   
   End;
end;
Wenn ich ein statisches Array benutze wird keine Exepction auslöst und die Daten im Array wurden korrekt eingelesen.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
Var
   floFStream : TFileStream;
   a : Array [ 1 .. 9 ] of byte;
   c : Array [ 0 .. 12543 ] of byte;
   breite,hoehe : Integer;
   l : Integer;

begin
   mpoOut.Clear;
   OpenDialog1.InitialDir := zgvExec;
   if Not OpenDialog1.Execute Then
      Exit;
   floFStream := TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite);
   Try
      floFStream.ReadBuffer(a,9);
      breite := a[6] + a[7]*256; // = 112
      hoehe := a[8] + a[9]*256; // = 112
      l := breite * hoehe; // = 12544

      floFStream.ReadBuffer(c,12544);    // keine Exception
   Finally
      floFStream.Free;   
   End;
end;
Ich habe mich jetzt mittels Google auf diversen Seiten, Tutorials und Foren getummelt und auch meine Delphi Bücher zu rate gezogen aber ich finde einfach nicht den Grund.

Nun hoffe ich darauf, dass jemand von euch eine Erklärung oder zumindest einen weiteren Denkanstoß parat hat.

Ich würde alternativ ein statisches Array der Größe 1 des Types Bytes benutzen, und dann mittels schleifen den Filestream Byte für Bytes auslesen und dann in ein dynamische Array vom Type ShortInt o.ä. rüberschaufeln was aber eher eine unglückliche Lösung wäre (getestet habe ich es auch noch nicht, da es für mich der Worst Case wäre).

Schönes Wochenende noch
Thomas
Angehängte Dateien
Dateityp: zip test.zip (433,3 KB, 5x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
 


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 01:47 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