Support Request #3810
closedDDL struct alignment in DDL3.0
Description
Support Anfrage:
Ich habe zwei Fragen zum SDK-Artikel "DDL Definition File Format". Das Alignment aus <struct> beeinflußt in DDL 2.x nur das Alignment in Arrays, wie ich lese.
1. Gilt das nur für Arrays mit arraysize > 1? Oder wird auch das erste Element anhand des <struct>-Alignments ausgerichtet?
2. Betrifft das <struct>-Alignment in DDL 3.0 weiterhin nur Arrays? Wirkt sich das <struct>-Alignment von 8 in der folgenden DDL 3.0 auf die Größe aus? Oder nicht (wie beobachtet), da die <struct> nicht von einem Element referenziert wird? Die tatsächliche Größe im DAT-File ist 43 bytes gegenüber den von mir vermuteten 48 bytes.
DDL 3.0:
<struct alignment="8" name="t_CAN_PCR_01_CAN_PCR_01" version="1"> <element alignment="8" arraysize="1" byteorder="LE" bytepos="0" name="ESP_v_ref" type="tFloat64" /> <element alignment="1" arraysize="1" byteorder="LE" bytepos="8" name="ESP_v_ref_Fahrtrichtung" type="tUInt8" /> <element alignment="1" arraysize="1" byteorder="LE" bytepos="9" name="PCR_Sensorstatus" type="tBool" /> <element alignment="8" arraysize="1" byteorder="LE" bytepos="16" name="PCR_Obj_vx_rel" type="tFloat64" /> <element alignment="8" arraysize="1" byteorder="LE" bytepos="24" name="PCR_Obj_vy_rel" type="tFloat64" /> <element alignment="8" arraysize="1" byteorder="LE" bytepos="32" name="PCR_Obj_TTC" type="tFloat64" /> <element alignment="1" arraysize="1" byteorder="LE" bytepos="40" name="PCR_Obj_Guete" type="tUInt8" /> <element alignment="1" arraysize="1" byteorder="LE" bytepos="41" name="PCR_Crashwahrscheinlichkeit" type="tUInt8" /> <element alignment="1" arraysize="1" byteorder="LE" bytepos="42" name="PCR_Sensorstatus_02" type="tUInt8" /> </struct> <stream description="streamid_5" name="TargetPCC" type="adtf.core.media_type"> <struct bytepos="0" name="t_CAN_PCR_01_CAN_PCR_01" type="t_CAN_PCR_01_CAN_PCR_01" /> </stream>
Lösung:
zu Frage 1.:
Die Position wird immer anhand des Alignments ausgerichtet. In der 2.0 hat der Coder nur den Fehler gemacht, dass er bei Arrays das letze Element nicht auf seine richtige Größe gepadded hat (wenn das Alignment das gefordert hätte), heißt die Gesamtgröße eine Arrays (auch wenn's nur 1 Element hatte) war nicht notwendiger weise ein Vielfaches des Alignments, die Positionen der Elemente passten aber zum Alignment.
zu Frage 2.:
Hier bist du wie viele andere über die Unterscheidung zwischen serialisierter und deserialiserter Beschreibung gestolpert. Die DDL beschreibt zwei Fassungen in einem :-):
deserialisiert: Positionen und Größen werden auf Basis des Alignments und Typgröße berechnet (alignment + type attribute, byte order ist immer nativ)
serialisiert: Positionen sind durch das bytepos Attribut festgelegt. (bytepos + type + byteorder attribute)
Der Recorder serialisiert die Daten im Speicher der Media Samples mit Hilfe der deserialisierten Beschreibung in die serialisierte Fassung. Daher landen in deinem Beispiel nur 43 Byte auf der Platte.