AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Binärdatei Record auslesen\zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

Binärdatei Record auslesen\zuweisen

Ein Thema von EWeiss · begonnen am 17. Apr 2018 · letzter Beitrag vom 18. Apr 2018
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 12:23
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 12:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 12:36
Ist nicht das eigentliche Problem, aber OPEN_ALWAYS solltest du zu OPEN_EXISTING ändern (bei MSDN-Library durchsuchenCreateFile) und bei MSDN-Library durchsuchenGetFileSize statt INVALID_HANDLE_VALUE auf INVALID_FILE_SIZE prüfen (ist der selbe Wert, nur nicht so verwirrend beim lesen ). Den zweiten Parameter kannst du hier auch auf nil setzen statt @FileSize (den Wert überschreibst du ja eh wieder sobald das Resultat der Funktion zugewiesen wird).

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? {$A1} , also packed ?

Edit: Kannst du mal die originale (unveränderte) Definition von TSTChannel verlinken?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (17. Apr 2018 um 12:38 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 12:44
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

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:07
PS: das "gute" alte file of TMyRecord funktioniert immernoch.

Externe Records NIEMALS pur definiert, sondern ausschließlich PACKED oder mit explizitem {$ALIGN x} (direkt davor oder über die ganze Datei)
und {$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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2018 um 13:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:09
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?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:17
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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2018 um 13:24 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:19
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}
Array [0..250] of AnsiChar;

Auf
Array [0..MAX_PATH] of AnsiChar;

dann kracht es.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:27
Wie meinst du das?
http://docwiki.embarcadero.com/RADSt...d_Input-Output
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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2018 um 13:31 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:33
Zitat:
var F: file of TSTChannel;
Ach so meinst du da.. Danke
Aber ich benötige ein Array.

gruss
  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 14:19 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-2025 by Thomas Breitkreuz