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
Seite 1 von 5  1 23     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:10
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.
streamName : Array [0..MASX_PATH] of AnsiChar;

Wieder so ein Mysterium für mich.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:15
Wo kommt die Datei denn her? Schreibst Du die selbst? Hilft es evtl., den Record als packed zu deklarieren?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:18
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

Geändert von EWeiss (17. Apr 2018 um 13:20 Uhr)
  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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:18
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?
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
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13:21
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

Geändert von EWeiss (17. Apr 2018 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13: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
 
#7

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13: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
 
#8

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13: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 13:38 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 13: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 16:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binärdatei Record auslesen\zuweisen

  Alt 17. Apr 2018, 14: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Apr 2018 um 14:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 18:57 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