Hallo,
habe mich mal angemeldet, weil ich in der Implementierung der Date-Time-Ressource im CI-Host einen Bug gefunden habe:
Wenn über die Ressource Datum/Zeit angefragt werden, antwortet der CI-Host ja mit Datum/Zeit plus dem UTC-Offset in Minuten. Das Ganze ist in einer Struktur von 7 Byte verpackt, die im VDR mit einem struct nachgebildet wird.
Das Problem ist: Im Speicher belegt das struct dann 8 Byte, weil das 16bit-Feld für den UTC-Offset an einer 2-Byte-Grenze ausgerichtet wird; entsprechend liegt im Speicher vor diesem Feld ein zusätzliches Padding-Byte (0x7F im Beispiel unten). Nachher bei SendData werden dann 7 Byte ab struct-Anfang ausgegeben; dabei entfällt durch das Padding-Byte dann das LSB vom UTC-Offset und ein falscher Wert wird übertragen (inwiefern sich das in der Praxis auswirkt, sei mal dahingestellt).
Beispiel:
Angehängt ist ein Patch, der den Bug behebt, bezogen auf die Version 2.0.5. Statt in einem struct wird die Antwort jetzt in einem Bytearray zusammengebaut.
(Die beiden 16bit-Werte Jahr und Offset könnte man theoretisch noch vorberechnen, damit man die jeweilige Berechnung nicht pro Byte macht.)
Edit: Die Vorberechnung ist sogar Pflicht, weil man die Variable nachher in einem Schritt einsetzen muss, damit nach htons die korrekte Bytereihenfolge zum Tragen kommt; also Version 2.
Edit 2: Ohne Zwischenvariable geht das auch; (letzte) Version 3.