Thomas Hertweck <ubtj@rz.uni-karlsruhe.de> wrote:
nach erfolgreicher Portierung eines C++ Programms von SGI Irix auf einen Linux PC (SuSE 6.2) ergibt sich nun ein kleines Pro- blem. Das Programm erwartet, dass Binaerdateien, die eingelesen werden, im Format einer big endian Maschine sind (auch auf dem PC). Nun die Frage: Wie kann man aus einem C++ Programm bestimmen, ob eine Binaer- datei, die auf der Festplatte liegt, im Format big endian oder little endian ist?
Eigentlich gar nicht, es sei denn, man hat es explizit irgendwo vermerkt. Ein gespeicherter 32-Bit-Wert, der auf einer Big-Endian-Maschine als 0x12345678 = 305419896 interpretiert wird, ist auf einer Little-Endian-Maschine eben eine 0x78563412 = 2018915346, aber es ist ihm nicht anzusehen, was es urspruenglich mal war.
Hat da vielleicht jemand ne Idee?
Nachtraegliche Erkennung ist schwierig. Das koennte allenfalls ueber eine Plausibilitaetspruefung laufen, wenn die zu erwartenden Werte nur aus einem Teil des moeglichen Wertebereichs stammen, aber das waere keine schoene Loesung. Es muss einfach festgelegt werden, wie die Werte in der Datei gespeichert werden. Es bietet sich an, in der Datei immer die "Network Byte Order" (entspricht Big-Endian) zu verwenden. Auf einer Little-Endian-Maschine muss das Programm dann beim Lesen und Schreiben der Datei alle Werte entsprechend umwandeln.
Eine Rou- tine fuer einen eventuellen Byteswap sollte anschliessend kein grosses Problem mehr sein....
Gibt's schon: htonl(i) wandelt den int-Wert i (32 Bit) von Host Byte Order (interne Darstellung der Maschine, auf der das Programm laeuft) in Network Byte Order um, ntohl(i) tut das Gegenteil. (Natuerlich tun die beiden eigentlich das gleiche, aber es ist schoener, im Quellcode die Umwandlungsrichtung am Namen erkennen zu koennen.) Die Funktionen htons und ntohs arbeiten entsprechend fuer short-Werte (16 Bit). Dafuer muss nur der Header <netinet/in.h> eingebunden werden. Eilert -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik eilert@informatik.uni-bremen.de - eilert@tzi.org - eilert@linuxfreak.com http://www.informatik.uni-bremen.de/~eilert/ --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (1)
-
eilert@informatik.uni-bremen.de