Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Binärdatei Record auslesen\zuweisen (https://www.delphipraxis.net/196036-binaerdatei-record-auslesen%5Czuweisen.html)

EWeiss 17. Apr 2018 12:10


Binärdatei Record auslesen\zuweisen
 
Der record..
Delphi-Quellcode:
  TSTChannel = record
    ID         : Integer;
    streamName : Array [0..250] of AnsiChar;
    freq       : single;
    volume     : single;
    pan        : single;
    mute       : byte;
    solo       : byte;
    duration   : Integer;
    percent    : Integer;
    grouplevel : single;
    led        : byte;
    rMeterValue : single;
    reserved   : Array [0..25] of AnsiChar;
  end;
Wenn ich die Datei öffne dann ist FileSize = Buffersize, die Bytes die gelesen wurden sind genauso groß.
Aber irgendwie bekomme ich nicht die werte die eigentlich zurück geliefert werden müssten.

Wenn ich das Array des streamName vergrößere funktioniert so gut wie gar nicht.

warum hat das so einen Einfluss?
Eigentlich dürfte es doch egal sein wie groß der Speicher für den Namen zugewiesen wird.
Delphi-Quellcode:
streamName : Array [0..MASX_PATH] of AnsiChar;


Wieder so ein Mysterium für mich.

gruss

DeddyH 17. Apr 2018 12:15

AW: Binärdatei Record auslesen\zuweisen
 
Wo kommt die Datei denn her? Schreibst Du die selbst? Hilft es evtl., den Record als packed zu deklarieren?

EWeiss 17. Apr 2018 12:18

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von DeddyH (Beitrag 1399519)
Wo kommt die Datei denn her? Schreibst Du die selbst? Hilft es evtl., den Record als packed zu deklarieren?

Nein ich schreibe sie nicht selbst. (noch nicht) ;)
Ich kenne nur die Definition.

Und öffne sie so.
Delphi-Quellcode:
var
  Channel: array[1..MAXCHANNEL] of TSTChannel;
Delphi-Quellcode:
    fHandle := CreateFile(PWideChar(sFile), GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (fHandle <> INVALID_HANDLE_VALUE) then
    begin
      FillChar(Channel, sizeof(TSTChannel) * MAXCHANNEL, 0);

      BufferSize := sizeof(TSTChannel) * MAXCHANNEL;
      FileSize := GetFileSize(fHandle, @FileSize);
      if (FileSize = INVALID_HANDLE_VALUE) then
        FileSize := 0;

      if (FileSize div sizeof(TSTChannel) = 8) then
        BufferSize := FileSize;

      if (FileSize < BufferSize) then
        BufferSize := 0
      else
      bErrorFlag := ReadFile(fHandle, Channel[1], BufferSize, dwBytesReaden, nil);

      CloseHandle(fHandle);
    end;
Der wert im Channel[1].Volume müsste 50 sein ist er aber nicht.

gruss

Neutral General 17. Apr 2018 12:18

AW: Binärdatei Record auslesen\zuweisen
 
Zeig mal etwas Code. Bin mir nicht ganz sicher wo dein Problem liegt.
Wenn du das streamName-Array vergrößert rutschen alle anderen Felder im Array entsprechend viele Bytes nach hinten und nichts ist mehr am richtigen Ort.

Woher hast du denn die Record-Definition von TSTChannel? Du hast gesagt du schreibst das Record noch nicht.
Wer schreibt es denn und bist du dir sicher, dass deine Record-Definition richtig ist?

EWeiss 17. Apr 2018 12:21

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Neutral General (Beitrag 1399521)
Zeig mal etwas Code. Bin mir nicht ganz sicher wo dein Problem liegt.
Wenn du das streamName-Array vergrößert rutschen alle anderen Felder im Array entsprechend viele Bytes nach hinten und nichts ist mehr am richtigen Ort.

Woher hast du denn die Record-Definition von TSTChannel? Du hast gesagt du schreibst das Record noch nicht.
Wer schreibt es denn und bist du dir sicher, dass deine Record-Definition richtig ist?

Ich sagte ich schreibe die Binäre Datei nicht selbst. Oder?

EDIT:
Zitat:

dass deine Record-Definition richtig ist?
Wenn der Filesize die Bytes die gelesen werden und der Buffersize das gleiche sind sollte es stimmen.
Aber wie gesagt kommen falsche werte an.

Wenn ich packed nehme dann ist der Buffersize und Bytesread kleiner wie Filesize.


gruss

Daniel 17. Apr 2018 12:23

AW: Binärdatei Record auslesen\zuweisen
 
Die Felder des Records liegen im Speicher hintereinander. Wenn Du eines der vorderen Felder - z.B. streamName - vergrößerst, rutscht alles Folgende nach hinten. Das ist schon plausibel.
Die Felder des Array können, müssen aber nicht zwingend /direkt/ hintereinander liegen. Das kannst Du mit dem Thema "Alignment" steuern. Oder eben mit dem Schlüsselwort "packed", dann liegt das Zeugs wirklich dicht an dicht im Speicher.
Entscheidend aber ist, dass Du dasselbe Alignment verwendest wie die Software, die die Datei schreibt. Da es letztlich nur 1, 2, 4, und 8 als gängige Möglichkeiten gibt, ist ausprobieren ggf. die schnellste Lösung.

EWeiss 17. Apr 2018 12:33

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Daniel (Beitrag 1399524)
Die Felder des Records liegen im Speicher hintereinander. Wenn Du eines der vorderen Felder - z.B. streamName - vergrößerst, rutscht alles Folgende nach hinten. Das ist schon plausibel.
Die Felder des Array können, müssen aber nicht zwingend /direkt/ hintereinander liegen. Das kannst Du mit dem Thema "Alignment" steuern. Oder eben mit dem Schlüsselwort "packed", dann liegt das Zeugs wirklich dicht an dicht im Speicher.
Entscheidend aber ist, dass Du dasselbe Alignment verwendest wie die Software, die die Datei schreibt. Da es letztlich nur 1, 2, 4, und 8 als gängige Möglichkeiten gibt, ist ausprobieren ggf. die schnellste Lösung.

Habe es versucht wie gesagt dann verändern sich die Daten im vergleiche zum FileSize.
Hmm.. kann jetzt aber auch nicht sehen was falsch sein könnte.
Die Datei ist von fly-worship 3KB

Danke.

gruss

Zacherl 17. Apr 2018 12:36

AW: Binärdatei Record auslesen\zuweisen
 
Ist nicht das eigentliche Problem, aber
Delphi-Quellcode:
OPEN_ALWAYS
solltest du zu
Delphi-Quellcode:
OPEN_EXISTING
ändern (bei MSDN-Library durchsuchenCreateFile) und bei MSDN-Library durchsuchenGetFileSize statt
Delphi-Quellcode:
INVALID_HANDLE_VALUE
auf
Delphi-Quellcode:
INVALID_FILE_SIZE
prüfen (ist der selbe Wert, nur nicht so verwirrend beim lesen :P). Den zweiten Parameter kannst du hier auch auf
Delphi-Quellcode:
nil
setzen statt
Delphi-Quellcode:
@FileSize
(den Wert überschreibst du ja eh wieder sobald das Resultat der Funktion zugewiesen wird).

Zitat:

Zitat von EWeiss (Beitrag 1399526)
Habe es versucht wie gesagt dann verändern sich die Daten im vergleiche zum FileSize.

Wie meinst du das "im Vergleich zu FileSize"? Welches Alignment hast du probiert?
Delphi-Quellcode:
{$A1}
, also
Delphi-Quellcode:
packed
?

Edit: Kannst du mal die originale (unveränderte) Definition von
Delphi-Quellcode:
TSTChannel
verlinken?

EWeiss 17. Apr 2018 12:44

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Welches Alignment hast du probiert? {$A1} , also packed ?
sorry habe vergessen wie man das Alignment zuweist. (Befehl von Delphi)
glaube das hatten wir schon mal.

Das andere werde ich ändern Danke.

Code:
TYPE STChannel
    ID         AS LONG
    streamName AS ASCIIZ * %MAX_PATH
    freq       AS SINGLE
    volume     AS SINGLE
    pan        AS SINGLE
    mute       AS BYTE
    solo       AS BYTE
    duration   AS LONG
    percent    AS LONG
    grouplevel AS SINGLE
    led        AS BYTE
    rMeterValue AS SINGLE
    reserved   AS ASCIIZ * 25 '// Total 320 bytes.
END TYPE
EDIT:
Geänderte Teil
Delphi-Quellcode:
    fHandle := CreateFile(PWideChar(sFile), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (fHandle <> INVALID_HANDLE_VALUE) then
    begin
      FillChar(Channel, sizeof(TSTChannel) * MAXCHANNEL, 0);

      BufferSize := sizeof(TSTChannel) * MAXCHANNEL;
      FileSize := GetFileSize(fHandle, nil);
      if (FileSize = INVALID_FILE_SIZE) then
        FileSize := 0;

      if (FileSize div sizeof(TSTChannel) = 8) then
        BufferSize := FileSize;

      if (FileSize < BufferSize) then
        BufferSize := 0
      else
      bErrorFlag := ReadFile(fHandle, Channel[1], BufferSize, dwBytesReaden, nil);

      CloseHandle(fHandle);
    end;
Hab zwei shots angehängt.
Bei Packed ist der ganze Speicher verschoben.

gruss

himitsu 17. Apr 2018 13:07

AW: Binärdatei Record auslesen\zuweisen
 
PS: das "gute" alte
Delphi-Quellcode:
file of TMyRecord
funktioniert immernoch.

Externe Records NIEMALS pur definiert, sondern ausschließlich PACKED oder mit explizitem
Delphi-Quellcode:
{$ALIGN x}
(direkt davor oder über die ganze Datei)
und
Delphi-Quellcode:
{$ALIGN 1} = PACKED
, egal ob Datei, Stream oder sonstwas.
denn du willst ja nicht, dass sich die Ausrichtugn irgendwann mal ändert und es dann nicht mehr zu deiner Datei passt.

Extern = von/nach außerhalb deines Programms.
(mit der Ausnahme, dass wenn die Datei/Stream ausschließlich nur von der eigenen EXE geschrieben/gelesen wird und das nicht über Programminstanzen hinweg)


AnsiChar war schonmal gut (kann auch für UTF-8 genutzt werden) oder eben WideChar, wegen Unicode.
Denn dynamische/compilerabhängige Typen sind auch verboten.

Zacherl 17. Apr 2018 13:09

AW: Binärdatei Record auslesen\zuweisen
 
Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre. Die Pfade der hinteren Einträge des Arrays stimmen ja bis aufs letzte Byte exakt. Sicher, dass
Delphi-Quellcode:
volume
an der Stelle 50 sein muss?

himitsu 17. Apr 2018 13:17

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Zacherl (Beitrag 1399532)
Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre.

Njain.

Es war mal vor Jahren 4 und in etwas aktuelleren Delphis ist es 8 (für Windows ... in anderen OS vielleicht anders)

http://docwiki.embarcadero.com/RADSt...chten_(Delphi)

PS:
http://docwiki.embarcadero.com/RADSt...chten_(Delphi)
http://docwiki.embarcadero.com/RADSt...Types_(Delphi)


ALIGN gibt aber nur die "maximale" Ausrichtung an.
Kleiner Typen werden an ihrer Größe ausgerichtet.
> WORD alle 2 Byte (außer &Align ist unter 2)
> Interger alle 4 Byte, also nach einem WORD bliebe eine Lücke von 2

EWeiss 17. Apr 2018 13:19

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

PS: das "gute" alte file of TMyRecord funktioniert immernoch.
Wie meinst du das?

Zitat:

Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre. Die Pfade der hinteren Einträge des Arrays stimmen ja bis aufs letzte Byte exakt. Sicher, dass volume an der Stelle 50 sein muss?
Ich habe die Regler in Fly auf 50% gesetzt von daher müsste es stimmen.

Habe alles versucht.
Delphi-Quellcode:
  {$Align On}
  {$ALIGN 8}
  TSTChannel = record
    ID         : Integer;
    streamName : Array [0..250] of AnsiChar;
    freq       : single;
    volume     : single;
    pan        : single;
    mute       : byte;
    solo       : byte;
    duration   : Integer;
    percent    : Integer;
    grouplevel : single;
    led        : byte;
    rMeterValue : single;
    reserved   : Array [0..25] of AnsiChar;
  end;

  {$Align Off}
Delphi-Quellcode:
Array [0..250] of AnsiChar;


Auf
Delphi-Quellcode:
Array [0..MAX_PATH] of AnsiChar;


dann kracht es.

gruss

himitsu 17. Apr 2018 13:27

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von EWeiss (Beitrag 1399535)
Wie meinst du das?

http://docwiki.embarcadero.com/RADSt...d_Input-Output
Delphi-Quellcode:
var F: file of TSTChannel;


Zitat:

Delphi-Quellcode:
  {$Align On}
  {$ALIGN 8}

Eines reicht. Es ist Alles das Gleiche.
Delphi-Quellcode:
{$A+} = {$ALIGN ON} = {$ALIGN 8} wobei 8 der DEFAULT ist
{$A-} = {$ALIGN OFF} = {$ALIGN 1}
Delphi-Quellcode:
  {$ALIGN 8}  // ab hier 8
  TSTChannel = record
     ..
  end;
  {$ALIGN ON} // ab hier wieder DEFAULT

EWeiss 17. Apr 2018 13:33

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

var F: file of TSTChannel;
Ach so meinst du da.. Danke ;)
Aber ich benötige ein Array.

gruss

himitsu 17. Apr 2018 13:34

AW: Binärdatei Record auslesen\zuweisen
 
Das ist ein Array bzw. eine Liste. :zwinker:

FileSize = Anzahl der Records, also in der API für diese "Typed Files"
FilePos = Index des Record

FileSize und FilePos werden intern auf RecSize umgerechnet. Delphi-Referenz durchsuchenSystem.Rewrite, wobei bei TypedFiles standardmäßig das dem SizeOf(DeinRecord) entspricht.


Delphi-Quellcode:
file of AnsiChar
=
Delphi-Quellcode:
Text
= eine Textdatei

EWeiss 17. Apr 2018 13:48

AW: Binärdatei Record auslesen\zuweisen
 
Du meinst wenn ich dich richtig verstehe anstelle von CreateFile..
Nur das löst mein Problem nicht.

Letztendlich ein Ersatz für die WinApi32.

gruss

himitsu 17. Apr 2018 13:57

AW: Binärdatei Record auslesen\zuweisen
 
Drum hatte ich es eigentlich auch nur nebenbei erwähnt.

Aber ansonsten wurde auch schon alles Wichtige genannt.
* die Speicherausrichtung
* die Art der Typen (z.B. AnsiChar und WideChar, aber nicht Char)

Arrays werden wie ihr enthaltener Typ ausgerichtet, außer bei "packed array",
und bei Records wie ihr größter Typ, außer bei "packed record".

EWeiss 17. Apr 2018 14:08

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von himitsu (Beitrag 1399544)
Drum hatte ich es eigentlich auch nur nebenbei erwähnt.

Aber ansonsten wurde auch schon alles Wichtige genannt.
* die Speicherausrichtung
* die Art der Typen (z.B. AnsiChar und WideChar, aber nicht Char)

Arrays werden wie ihr enthaltener Typ ausgerichtet, außer bei "packed array",
und bei Records wie ihr größter Typ, außer bei "packed record".

Danke für die Infos.
Das ist wieder ein fall wo ich mir nur selber helfen kann..

Also nochmal Danke an alle die versucht haben für mich mitzudenken. :)

gruss

Jasocul 17. Apr 2018 14:29

AW: Binärdatei Record auslesen\zuweisen
 
So, noch mal kurz vor Feierabend ins Forum geschaut.

Dein Record hat 312 Byte. Die Blöcke in der Datei sind 320 Byte groß.

Wenn ich das richtig in Erinnerung habe, sind Records standardmäßig nicht gepackt. In Turbo-Pascal war das noch anders. :)

Entweder ist dein Record falsch definiert oder die Speicher-Ausrichtung passt nicht. Ich habe das nicht exakt nachgerechnet, aber ich meine, dass die Ausrichtung zu einer Verschiebung um 10 Byte führen sollte. Das passt dann immer noch nicht zu den 320 Byte.

Lies das doch mal in Blockgrößen (Record of Array [0..319] definieren) zu 320 Byte ein und teste Stückweise, wie es in den geplanten Record passt.
Klassisches Beispiel für einen varianten Record.

KodeZwerg 17. Apr 2018 14:37

AW: Binärdatei Record auslesen\zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab arge Probleme mit deiner RecordSize, schreib oder Knipps mal erstes Record und sag exakt wie dafür die werte sein müßten.
Momentan komm ich damit nicht klar, siehe Bild.

himitsu 17. Apr 2018 14:41

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Wenn ich das richtig in Erinnerung habe, sind Records standardmäßig gepackt.
Du hast das NICHT in "standardmäßig nicht gepackt" vergessen.

Standardmäßig ist jede Variable im Arbeitsspeicher ausgerichtet, für einen "optimalen" Speicherzugriff, ohne rumschieben und kopieren zu müssen.


PS: wie wäre es mit einer Embedded DB? (Firebird, SQLite, ...)

EWeiss 17. Apr 2018 14:42

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Hab arge Probleme mit deiner RecordSize, schreib oder Knipps mal erstes Record und sag exakt wie dafür die werte sein müßten.
Der RecordSize sollte 2880 sein.
Wenn es das ist was du meinst.

Der Streamname passt ja ist bei mir auch so. ;)

gruss

Jasocul 17. Apr 2018 14:46

AW: Binärdatei Record auslesen\zuweisen
 
Sry himitsu, du hast natürlich Recht. Bin im Moment mit dem Handy angemeldet. Ich korrigiere das, sobald ich kann

KodeZwerg 17. Apr 2018 14:53

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von EWeiss (Beitrag 1399552)
Wenn es das ist was du meinst.

Nein, ich brauch korrekte Daten für's erste Record damit ich deine Type definition überarbeiten kann, da stimmt was nicht.

Alternativ spiel mit diesem Schnippsel rum, mit dem entstand das Bild von oben. Nicht lachen aber so mach ich es.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
type
    TSTChannel = packed record
    ID : Integer;
//    streamName : Array [0..250] of AnsiChar;
    streamName : Array [0..MAX_PATH] of AnsiChar;
    freq : single;
    volume : single;
    pan : single;
    mute : byte;
    solo : byte;
    duration : Integer;
    percent : Integer;
    grouplevel : single;
    led : byte;
    rMeterValue : single;
    reserved : Array [0..25] of AnsiChar;
   end;
var
 STChannel : TSTChannel;
 MyRead: File of TSTChannel;
 i : Integer;
begin
 Memo1.Clear;
  AssignFile(MyRead, '.\Channels.bin');
  Reset(MyRead);

  try
    while not EOF(MyRead) do
    begin
      Read(MyRead, STChannel);
      with STChannel do
      begin
       Memo1.Lines.Add('ID: '+IntToStr(ID));
       Memo1.Lines.Add('StreamName: '+String(StreamName));
       Memo1.Lines.Add('Freq: '+FloatToStr(freq));
       Memo1.Lines.Add('Volume: '+FloatToStr(Volume));
       Memo1.Lines.Add('Pan: '+FloatToStr(Pan));
       Memo1.Lines.Add('Mute: '+IntToStr(Mute));
       Memo1.Lines.Add('Solo: '+IntToStr(Solo));
       Memo1.Lines.Add('Duration: '+IntToStr(Duration));
       Memo1.Lines.Add('Percent: '+IntToStr(Percent));
       Memo1.Lines.Add('GroupLevel: '+FloatToStr(GroupLevel));
       Memo1.Lines.Add('Led: '+IntToStr(Led));
       Memo1.Lines.Add('rMeterValue: '+FloatToStr(rMeterValue));
       Memo1.Lines.Add('Reserved: '+String(Reserved));
       Memo1.Lines.Add('');
      end;
    end;
  finally
   CloseFile(MyRead);
  end;
end;

EWeiss 17. Apr 2018 15:04

AW: Binärdatei Record auslesen\zuweisen
 
Ich habe nur das Bin file und versuche daraus die Korrekten Daten einzulesen.
Da mein einlesen der Datei fehlschlägt kann ich dir auch keine korrekten Daten für den erste Record liefern.

Zitat:

Nicht lachen aber so mach ich es.
Warum sollte ich das tun ;)

gruss

HolgerX 17. Apr 2018 15:06

AW: Binärdatei Record auslesen\zuweisen
 
Hmm..

Ich werfe einfach mal Big-Endian/Little-Endian in den Raum.

Eventuell wird für die Kodierung des Single-Wertes im Ausgangssystem auch was ganz anderes verwendet...

(Nur so eine Idee ;) )

EWeiss 17. Apr 2018 15:10

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Nein, ich brauch korrekte Daten für's erste Record damit ich deine Type definition überarbeiten kann, da stimmt was nicht.
Ich werfe noch mal ein Pic im Raum.. sorry versuche das zu vermeiden.

Packed funktioniert nicht den dann verschiebst du den gesamten Speicher des Rekords.
Sieh Anhang.

gruss

Neutral General 17. Apr 2018 15:11

AW: Binärdatei Record auslesen\zuweisen
 
Falls du (ungefähr) weißt was in einem dieser Channel Records drin stehen müsste, dann öffne die .bin doch mal in einem Hex-Editor und dann siehst du wie lang das Record ist und wie die Felder liegen. Dementsprechend kannst du dann deinen Code anpassen. Oder falls die Datei nicht so groß ist usw. kannst du sie vllt. ja mal hochladen.

EWeiss 17. Apr 2018 15:12

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Neutral General (Beitrag 1399570)
Falls du (ungefähr) weißt was in einem dieser Channel Records drin stehen müsste, dann öffne die .bin doch mal in einem Hex-Editor und dann siehst du wie lang das Record ist und wie die Felder liegen. Dementsprechend kannst du dann deinen Code anpassen. Oder falls die Datei nicht so groß ist usw. kannst du sie vllt. ja mal hochladen.

Der FileSize ist OK!
2,81 KB (2.880 Bytes)...

gruss

Neutral General 17. Apr 2018 15:16

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von EWeiss (Beitrag 1399573)
Zitat:

Zitat von Neutral General (Beitrag 1399570)
Falls du (ungefähr) weißt was in einem dieser Channel Records drin stehen müsste, dann öffne die .bin doch mal in einem Hex-Editor und dann siehst du wie lang das Record ist und wie die Felder liegen. Dementsprechend kannst du dann deinen Code anpassen. Oder falls die Datei nicht so groß ist usw. kannst du sie vllt. ja mal hochladen.

Der FileSize ist OK!
2,81 KB (2.880 Bytes)...

gruss

Ich glaube du hast meinen Post nur überflogen :P
Ich hab gefragt ob du die Datei mal hochladen könntest, damit wir uns das mal anschauen können.

HolgerX 17. Apr 2018 15:18

AW: Binärdatei Record auslesen\zuweisen
 
Hmm..

Wenn ich dass richtig sehe, sind die Array Definitionen falsch!

Richtig müsste es so sein:
(Oben das Original)

Delphi-Quellcode:
{
MAX_PATH = 260;

TYPE STChannel
    ID        AS LONG
    streamName AS ASCIIZ * %MAX_PATH
    freq      AS SINGLE
    volume    AS SINGLE
    pan       AS SINGLE
    mute      AS BYTE
    solo      AS BYTE
    duration  AS LONG
    percent   AS LONG
    grouplevel AS SINGLE
    led       AS BYTE
    rMeterValue AS SINGLE
    reserved  AS ASCIIZ * 25 '// Total 320 bytes.
END TYPE
}

type
  TSTChannel = packed record
    ID         : LONGINT;
    streamName : Array [0..MAX_PATH-1] of AnsiChar;
    freq       : single;
    volume     : single;
    pan        : single;
    mute       : BYTE;
    solo       : BYTE;
    duration   : LONGINT;
    percent    : LONGINT;
    grouplevel : single;
    led        : BYTE;
    rMeterValue : single;
    reserved   : Array [0..24] of AnsiChar;
  end;
So kommt auch die Länge von 320 Bytes hin...

Ein C-Array von 25er Länge ist in Delphi ein Array von 0..24 !

(Erstellt mit D6)

Neutral General 17. Apr 2018 15:20

AW: Binärdatei Record auslesen\zuweisen
 
Du hast Recht. Doof, dass echt keiner von uns in den ganzen 4 Seiten drauf gekommen ist :oops: :lol:
Die Arrays waren jeweils 1 Element zu lang.

EWeiss 17. Apr 2018 15:31

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Neutral General (Beitrag 1399574)
Zitat:

Zitat von EWeiss (Beitrag 1399573)
Zitat:

Zitat von Neutral General (Beitrag 1399570)
Falls du (ungefähr) weißt was in einem dieser Channel Records drin stehen müsste, dann öffne die .bin doch mal in einem Hex-Editor und dann siehst du wie lang das Record ist und wie die Felder liegen. Dementsprechend kannst du dann deinen Code anpassen. Oder falls die Datei nicht so groß ist usw. kannst du sie vllt. ja mal hochladen.

Der FileSize ist OK!
2,81 KB (2.880 Bytes)...

gruss

Ich glaube du hast meinen Post nur überflogen :P
Ich hab gefragt ob du die Datei mal hochladen könntest, damit wir uns das mal anschauen können.

Danke habe ich ;)
https://www.delphipraxis.net/1399535-post13.html

gruss

EWeiss 17. Apr 2018 15:36

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Neutral General (Beitrag 1399577)
Du hast Recht. Doof das echt keiner von uns in den ganzen 4 Seiten drauf gekommen ist :oops: :lol:
Die Arrays waren jeweils 1 Element zu lang.

Boahhh eh ja so kann es manchmal gehen :) :wall: :mrgreen:
@HolgerX Danke vielmals..

gruss

KodeZwerg 17. Apr 2018 15:40

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von HolgerX (Beitrag 1399575)
(Erstellt mit D6)

Hallo HolgerX, ich habe mal deine Type definition ausprobiert, für Record 1-7 aus der .bin klappt es mit der "StreamName" nun, Record 8 und 9 wird übersprungen.
Per HexEdit zeigt der mir für #8 auch einen gekappten Namen an ("weetly Broken (A)\Loop.mp3" alle anderen beginnen mit "Sweetly Broken") und #9 ist leer.
Könnte es sein dass das (#8 und #9) entfernte Records sind? Also Überbleibsel.

EWeiss 17. Apr 2018 15:54

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1399585)
Zitat:

Zitat von HolgerX (Beitrag 1399575)
(Erstellt mit D6)

Hallo HolgerX, ich habe mal deine Type definition ausprobiert, für Record 1-7 aus der .bin klappt es mit der "StreamName" nun, Record 8 und 9 wird übersprungen.
Per HexEdit zeigt der mir für #8 auch einen gekappten Namen an ("weetly Broken (A)\Loop.mp3" alle anderen beginnen mit "Sweetly Broken") und #9 ist leer.
Könnte es sein dass das (#8 und #9) entfernte Records sind? Also Überbleibsel.

Ich werde mir das nachher nochmal genau anschauen.;)

gruss

HolgerX 17. Apr 2018 17:46

AW: Binärdatei Record auslesen\zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..

Hab mal nen kleines Testtool...

Scheint alles nun zu passen..


(Erstellt mit D6)

KodeZwerg 17. Apr 2018 18:00

AW: Binärdatei Record auslesen\zuweisen
 
Ok, Dein Tool bringt die gleichen Ergebnisse, #8 und #9 entweder defekt oder sonst was.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
type
  TSTChannel = packed record
    ID : LONGINT;
    streamName : Array [0..MAX_PATH-1] of AnsiChar;
    freq : single;
    volume : single;
    pan : single;
    mute : BYTE;
    solo : BYTE;
    duration : LONGINT;
    percent : LONGINT;
    grouplevel : single;
    led : BYTE;
    rMeterValue : single;
    reserved : Array [0..24] of AnsiChar;
   end;
var
 STChannel : TSTChannel;
 MyRead: File of TSTChannel;
begin
  Memo1.Clear;
  AssignFile(MyRead, '.\Channels.bin');
  Reset(MyRead);
  try
    while not EOF(MyRead) do
    begin
      Read(MyRead, STChannel);
      with STChannel do
      begin
       Memo1.Lines.Add('RECORD >>> '+IntToStr(FilePos(MyRead))); // Da ID nichts liefert, liefer ich mir selbst was
       Memo1.Lines.Add('ID: '+IntToStr(ID));
       Memo1.Lines.Add('StreamName: '+String(StreamName));
       Memo1.Lines.Add('Freq: '+FloatToStr(freq));
       Memo1.Lines.Add('Volume: '+FloatToStr(Volume));
       Memo1.Lines.Add('Pan: '+FloatToStr(Pan));
       Memo1.Lines.Add('Mute: '+IntToStr(Mute));
       Memo1.Lines.Add('Solo: '+IntToStr(Solo));
       Memo1.Lines.Add('Duration: '+IntToStr(Duration));
       Memo1.Lines.Add('Percent: '+IntToStr(Percent));
       Memo1.Lines.Add('GroupLevel: '+FloatToStr(GroupLevel));
       Memo1.Lines.Add('Led: '+IntToStr(Led));
       Memo1.Lines.Add('rMeterValue: '+FloatToStr(rMeterValue));
       Memo1.Lines.Add('Reserved: '+String(Reserved));
       Memo1.Lines.Add('');
      end;
    end;
  finally
   CloseFile(MyRead);
  end;
end;
Danke für check!

EWeiss 17. Apr 2018 18:07

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von HolgerX (Beitrag 1399601)
Hmm..

Hab mal nen kleines Testtool...

Scheint alles nun zu passen..


(Erstellt mit D6)

Jo stimmt schon ;)
Zitat:

Memo1.Lines.Add('RECORD >>> '+IntToStr(FilePos(MyRead))); // Da ID nichts liefert, liefer ich mir selbst was
Die liefert nichts wird aber in der Anwendung zugewiesen.
Das Teil ist nur zum testen meiner LIB.

gruss


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