Hallo, 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? Hat da vielleicht jemand ne Idee? Eine Rou- tine fuer einen eventuellen Byteswap sollte anschliessend kein grosses Problem mehr sein.... Fuer jegliche Hinweise und Tips waere ich dankbar. Gruesse aus Karlsruhe Thomson PS: Falls meine Ausdrucksweise Fehler beinhalten sollte, so bitte ich, das zu entschuldigen, ich befasse mich erst seit neustem mit diesen Dingen.... :-) Ich hoffe, man versteht das Problem trotz allem.... -- Thomas Hertweck Geophysikalisches Institut, Universitaet (TH) Karlsruhe Email: ubtj@rz.uni-karlsruhe.de Linux is like a wigwam - no windows, no gates, apache inside! --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
* Thomas Hertweck wrote on Wed, Feb 02, 2000 at 10:28 +0100:
Das Programm erwartet, dass Binaerdateien, die eingelesen werden, im Format einer big endian Maschine sind (auch auf dem PC). 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?
Na, immer big endian, weil das Programm es so erwartet? Du fragst doch eher, wie bekommt man raus, ob man big endian als big endian liest, oder konvertieren muß, oder? Wenn Du nicht weißt, was das für ein File ist, und es in diesem nicht drinsteht, kannst Du nur raten (z.B. wenn bekannt ist, das die Datei viele kleine und wenig große Werte enthält, einfach ein paar K lesen, und das nehmen, wo die Gesammtsumme kleiner ist). Was Dein System macht, bekommt man vermutlich über irgentein autoconf define raus, oder Du macht ein int und char Union, schreibst 0x1234 rein, und schaust über char nach, was im Speicher steht. oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel. --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, das Problem haben wir inzwischen wie folgt geloest. Da das Pro- gramm immer big endian Daten erwartet, muss im Prinzip nur ge- checkt werden, auf was fuer einer Maschine man sich momentan be- findet. Das haben wir in etwa wie folgt getan (Testprogramm): #include <iostream> int main () { int i = 1; void *dummy = &i; char *bytes = (char*) dummy; cerr << ((*bytes) ? "Little endian" : "Big endian") << endl; } Nun, je nachdem, was sich ergibt, muss dann ein Byteswap durch- gefuehrt werden oder nicht, das ganze sowohl beim Lesen als auch beim Schreiben auf die Platte. Erste Tests zeigen, dass das so ganz gut funktioniert. Eilert Brinkmann hatte die Loesung in seiner Email auch schon angedeutet, desweiteren hat er darauf hingewiesen, dass es Systemroutinen gibt, die einem manchmal gewisse Arbeiten abnehmen koennen, siehe htonl, ntohl, htons und ntohs. Vielen Dank fuer alle Antworten! Gruesse aus Karlsruhe Thomson -- Thomas Hertweck Geophysikalisches Institut, Universitaet (TH) Karlsruhe Email: ubtj@rz.uni-karlsruhe.de Linux is like a wigwam - no windows, no gates, apache inside! --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (2)
-
steffen@dett.de
-
ubtj@rz.uni-karlsruhe.de