Ich möchte eine Struktur mit vielen Strukturen in einem anderen Controller senden (nicht die gleiche Marke des Controllers, mit einer anderen Architektur). Ich benötige eine Art Serialisierung, um Daten ohne Verwendung der erfundenen Serialisierungsmethoden zu übertragen. Wie finde ich heraus, wo aufgefüllte Bytes hinzugefügt werden, damit ich sie entfernen kann, bevor ich sie an den anderen Controller sende? Wie kann ich Metadaten implementieren, so dass der andere Controller jedes Mitglied der Struktur aus den übertragenen Datenbytes rekonstruieren kann? Alle anderen Punkte, die auch erforderlich sein können, wären willkommen.Übertragen von Strukturen zwischen den Controllern
Antwort
Verwenden Sie TLV-Typ des Codierungsschemas. Es wird normalerweise als Typ Length Value bezeichnet.
Normalerweise sieht ein Element wie
#pragma pack(1)
typedef struct _tlv_node {
uint8_t type;
uint16_t length;
uint8_t value[0];
}tlv_node;
Diese für viele Codierung und Decodierung Ströme ist ziemlich Standard und man kann es auf alle Arten von Struktur erstrecken. Eine Menge Open-Source-Code hat dies implementiert, daher gibt es keinen Mangel an Beispiel-Implementierungen.
Voll tragbare Serialisierung/De-Serialisierung ist ziemlich manuell. Sie gehen einfach durch jedes Mitglied der Struktur und kopieren es. Sie könnten offsetof
verwenden, um Padding zu erkennen, aber das ist meistens sinnlos, da es bedeutet, dass Sie sowieso ein "manuelles Codieren" pro Strukturelement durchführen müssten.
#pragma pack(1)
und ähnliches ist nicht ideal. Structs sind aus einem bestimmten Grund gepackt, und es gibt keine tragbaren Mittel, um das Padding zu deaktivieren. Es kann auf einigen kleineren CPUs wie 8 oder 16 Bit machbar sein, aber nicht für vollständig tragbaren Code.
Wichtig ist ein gut definiertes Netzwerkprotokoll, das angibt, wie Daten gespeichert werden, einschließlich Endianess. Das heißt, der Sender, das Protokoll und der Empfänger haben alle Endlichkeit und sie sind nicht notwendigerweise dieselben.
(Traditionell verwenden Datenprotokolle oft Big-Endian, da dies die einzige Sache ist, die für die Implementierung von Hardware-CRC-Prüfungen mit XOR-Gattern sinnvoll ist, aber das ist heutzutage meistens kein Problem. Einige MCUs haben sogar eingebaute CRC-Prüfhardware .)
Je nach Anforderung könnte das "wohldefinierte Netzwerkprotokoll" sogar ASCII-basiert sein. Eine solche Übertragung ist viel sicherer und einfacher zu implementieren und zu überwachen/zu debuggen als jedes Binärprotokoll. – tofro
@tofro Nicht wirklich, ASCII-Protokolle bedeuten Daten aufblähen und langsamer Codierung/Decodierung. Der einzige Grund, warum Sie sie verwenden würden, ist, wenn die Überwachung von Nicht-Programmierern durchgeführt werden sollte. Ich würde vermeiden, alten Mist wie "AT-Befehle" zu implementieren. – Lundin
Das meiste, wenn nicht alles der Sache, die Internet genannt wird, basiert auf solch "altem Mist". Kann nicht so schlimm sein? – tofro
- 1. (Swift) Daten zwischen den View Controllern übertragen
- 2. Übertragen von Daten zwischen View-Controllern
- 3. Swift MKMapViewDelegate - Übertragen von Koordinaten zwischen den View-Controllern
- 4. Daten werden nicht zwischen Controllern übertragen
- 5. javafx Kommunikation zwischen den Controllern
- 6. Wie Daten zwischen Eltern und Kind View Controllern übertragen werden
- 7. Daten zwischen Controllern übergeben
- 8. Spring MVC: @SessionAttributes zwischen den Controllern geteilt?
- 9. Informationen zwischen den Controllern Swifty (/ Protokoll) übergeben?
- 10. Angularjs: Argumente zwischen Controllern übergeben
- 11. Ionic/AngularJS Pass Parameter zwischen den Controllern
- 12. Xcode (Swift): Ich kann keine Daten zwischen den View Controllern übertragen
- 13. Angularjs Sharing-Methoden zwischen den Controllern
- 14. Kommunikation zwischen verschachtelten Controllern
- 15. Übergeben von Daten zwischen den Controllern mit der Sitzung RESTvoll
- 16. IOS Objective C Gabe von Daten zwischen den Controllern Ansicht
- 17. Übergeben von Objekten zwischen den Controllern ohne Initialisierung des Hauptfensters
- 18. Speichern von Daten zwischen den Controllern als uique
- 19. Übergeben von Daten zwischen den Controllern in OnsenUI + AngularJS + PhoneGap
- 20. Ember.js: Datenbindung zwischen Controllern
- 21. Winkeldienst zwischen Controllern
- 22. Übertragen von Variablen zwischen Klassen
- 23. Wie Werte zwischen den Eingabewerten übertragen werden
- 24. Daten zwischen den Komponenten übertragen Angular4
- 25. Analyse von JSON-Daten zwischen View-Controllern
- 26. Übergeben von Daten zwischen zwei Schnittstellen-Controllern
- 27. Übergeben Strukturen zwischen Funktionen
- 28. Freigeben von Daten zwischen zwei Controllern angularjs
- 29. Angular 2: Übertragen von Inhalten zwischen den Komponententags
- 30. AngularJS Austausch von Daten zwischen Controllern
Und der Code ist b0rken und ungültig. Insbesondere das Überschreiten des einen Elements im Wert hat ein undefiniertes Verhalten, und "pack" ist ein Hack, der sehr teuer sein könnte. –
Willkommen im Jahr 1999, wir brauchen den unsicheren "struct hack" nicht mehr zu benutzen. – Lundin
@lundin Sie sprechen hier für sich, Pragma Pack ist kein Hack, es wird von allen populären Toolchains für die meisten populären Prozessoren unterstützt, und es ist aus einem Grund da, um sicherzustellen, dass der Speicher auf ein bestimmtes Layout, Hardware-Register zeigt oder Netzwerkpakete. Auch wenn man sich über das Packen lustig macht, ist es ziemlich verrückt, wenn eine ganze Reihe von Prozessoren immer noch sig- busisch agieren. Auch wenn man im Internet streiten wird, wird es nie alt werden. Aber ich mag deine Antwort. – amritanshu