Ich entwickle ein Programm, wobei ich eine Bibliothek von jemand anderem zum Export der Daten in einem bestimmten Format nutze. Das Prinzip dabei ist, daß die Daten aus den RAM in eine Datei kopiert werden. Während das auf X86-CPUs funktioniert, musste ich feststellen, daß das Programm auf der PPC-Architektur korrupte Dateien erzeugt. Der Grund liegt darin, daß im Big-Endian-Modus gearbeitet wird, was bedeutet daß die Variablen im RAM-Speicher verkehrt herum abgelegt sind (das letzte Byte einer Variable entspricht dem ersten zugewiesenen Byte im Speicher). Im HEX-Editor musste ich feststellen, daß sämtliche Variablen in der Ausgabe-Datei byteweise verkehrt herum stehen.
Weiss jemand, ob es ein C++ Makro oder ein Compilerflag gibt, um dieses Problem zu beheben? Eine Optimierung des Quellcodes wäre zu viel Aufwand.
Hallo Paul!
Der Grund liegt darin, daß im Big-Endian-Modus gearbeitet wird, was bedeutet daß die Variablen im RAM-Speicher verkehrt herum abgelegt sind.
Direktes Speichern von binären Dates ist halt einfach nicht Plattform übergreifernd und sollte deshalb vermieden werden.
Weiss jemand, ob es ein C++ Makro oder ein Compilerflag gibt, um dieses Problem zu beheben? Eine Optimierung des Quellcodes wäre zu viel Aufwand.
Das gleich Problem gibt es ja auch im Netzwerkbereich. Da hier auch die unterschiedlichsten Rechner miteinander kommunizieren sollen, wurde die Network-Byte-Order festgelegt (Bigendian). Vor (Integer-) Daten übers Netzwerk gehen, müssen sie nach Network-Byte-Order konvertiert werden und alles was vom empfangen wird, muss in das jeweilige Host-Byte-Order Format gewandelt werden.
Dazu gibt es die Funktionen htons, htnl, ntohs und ntohl. Schau Dir mal die Manpage an. Vielleicht hilft Dir das weiter. $ man 3 hton
Die Alternative ist das Speichern als Text, evtl. gleich alles in einem XML-Format.
Harald
Danke für die Antwort…
Es handelt sich um ein QT-Programm, bei dem lediglich eine Export-Funktion von einem anderen Programm adaptiert wurde, die nicht von der QTlib abhängig ist.
Nachdem ich mir die QDataStream-Klasse einwenig angeschaut habe merkte ich, daß es ggf. doch nicht schwer ist, die ganze Export-Funktion QT-konform zu konvertieren, da es zu jeder ioStream-Funktion ein passendes Gegenstück gibt und zu jedem genormten Integer-Typ ebenfalls. So reicht ggf. ein Suchen/Ersetzen von Wörtern aus. QT erlaubt es, prozessorunabhängig vorzugeben, in welchem Format ein Datenstrom zusammengesetzt wird.