Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen (https://www.delphipraxis.net/175376-record-mit-word-feldern-ohne-msb-lsb-vertauschung-aus-datei-lesen.html)

Christian Seehase 17. Jun 2013 18:17

Delphi-Version: 2006

record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Moin Zusammen,

irgendwie steh' ich gerade auf dem Schlauch :?

Ich möchte mit Hilfe von Records aus einer Binärdatei lesen.
Die Records erhalten gemischt Byte, Word und DWORD Felder.
Dummer Weise werden beim Einlesen aber die Bytes, z.B. von WORDS, vertauscht, so dass aus B0E1 in der Datei E1B0 im Record wird.
Bislang ist mir nichts eingefallen, wie ich das Problem beheben kann, denn ich möchte, nach Möglichkeit, darauf verzichten nur Bytes zu lesen und ggf. die Werte selber zusammenzubauen.

Ich habe es schon mit Varianten Records versucht, mit array of byte und der gewünschten Struktur als Variante, mit dem Lesen eines array of byte, dass ich mit Copy, Move, CopyMemory übertragen habe, aber auch mit absolute auf einer Variablen, die als Lesebuffer dienen soll. Immer das gleiche Ergebnis.

Hat irgendjemand eine Idee, wie ich das anstellen kann?

Vielen Dank im Voraus.

x000x 17. Jun 2013 20:42

AW: record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Moin Chris,

so ganz kann ich es nicht verstehen, denn dann werden sie ja vermutlich anders in die Datei geschrieben als du liest :gruebel:

Eventuell hilft dir ja die funktion SwapDWord weiter?!

Furtbichler 18. Jun 2013 06:50

AW: record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Die Datei schein von einem Big-Endian Rechner/Programm erstellt worden zu sein. Ich bin mir nicht 100% sicher, ob es auch in der Intel-Welt Software gibt, die die Daten als Big-Endian schreibt (könnte sein, wg. Kompatibilität zu anderen Systemen, z.B. Mac) Wer ist der Ersteller der Dateien?

Zitat:

Zitat von Christian Seehase (Beitrag 1218822)
...denn ich möchte...darauf verzichten nur Bytes zu lesen und ggf. die Werte selber zusammenzubauen.

Egal, wie Du es anstellst: Irgendwer wird die Daten dann doch zusammenbauen. Bei SO haben sie diverse Lösungsansätze.

Wenn die Dateien wirklich von einem Big Endian kommen, ist die Welt in Ordnung, dein 'Problem' also 'as designed'. Lies die Daten ein und vertausche die Bytes.

Delphi-Quellcode:
MyRecord.Read(myStream);
MyRecord.Word1 := WordSwap(MyRecord.Word1);
MyRecord.Word2 := WordSwap(MyRecord.Word2);
MyRecord.DWord1 := DWordSwap(MyRecord.DWord1);
...

p80286 18. Jun 2013 09:42

AW: record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Zitat:

Zitat von Furtbichler (Beitrag 1218846)
Die Datei schein von einem Big-Endian Rechner/Programm erstellt worden zu sein. Ich bin mir nicht 100% sicher, ob es auch in der Intel-Welt Software gibt, die die Daten als Big-Endian schreibt (könnte sein, wg. Kompatibilität zu anderen Systemen, z.B. Mac)

Da gibt es jede Menge (Grafik/DTP/Sound/Video..).
Besonders nett sind die, die beide Formate verwenden.

@Christian
Ich denke es geht kein Weg am swapping vorbei.

Gruß
K-H

Christian Seehase 19. Jun 2013 10:28

AW: record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Moin Zusammen,

vielen Dank für die Rege Beteiligung.
Ich hatte gehofft irgendeine Konfigurationsmöglichkeit übersehen zu haben, die mir das Swapping erspart. Na gut, dann eben nicht :wink:
Dann muss ich mal testen, was effinzienter ist.
Bytes lesen und anschliessend auf passende Variablen verteilen und gleich die richtigen Strukturen lesen und anschliessend die Bytes vertauschen.

Zitat:

Zitat von Furtbichler (Beitrag 1218846)
Wer ist der Ersteller der Dateien?

Es geht um die Verarbeitung von Transport Streams.

Namenloser 19. Jun 2013 15:07

AW: record mit Word-Feldern ohne MSB/LSB Vertauschung aus Datei lesen
 
Hatte nicht himitsu für sein himXML was gebastelt, um records automatisch zu (de)serialisieren? Vielleicht kannst du das abwandeln.


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