Unterschiedliche Binärdateien
Ich habe ein C-Programm (GNU C) unter Unix geschrieben, mit dem ich eine Binärdatei einlese. Dieses funktioniert unter Unix unproblematisch. Wenn ich das Programm aber unter Windows NT kompiliere (Visual C++ 4.2) und danach die gleiche Binärdatei verarbeiten möchte, werden die Binärdaten beim Einlesen anders interpretiert. Der Code enthält keine Unix-spezifischen Befehle, gibt lediglich Text aus und benutzt keine Fenster. Ich habe erfahren, daß beim Einlesen von Binärdaten in der UNIX- und in der Windows-Welt die Bytes in einer anderen Reihenfolge interpretiert werden. Es ist mir aber nicht bekannt, wo im Detail der Unterschied liegt. Gibt es ein Programm, das die Binärdaten von Unix nach Windows konvertiert?
Ich habe ein C-Programm (GNU C) unter Unix geschrieben, mit dem ich eine Binärdatei einlese. Dieses funktioniert unter Unix unproblematisch. Wenn ich das Programm aber unter Windows NT kompiliere (Visual C++ 4.2) und danach die gleiche Binärdatei verarbeiten möchte, werden die Binärdaten beim Einlesen anders interpretiert. Der Code enthält keine Unix-spezifischen Befehle, gibt lediglich Text aus und benutzt keine Fenster. Ich habe erfahren, daß beim Einlesen von Binärdaten in der UNIX- und in der Windows-Welt die Bytes in einer anderen Reihenfolge interpretiert werden. Es ist mir aber nicht bekannt, wo im Detail der Unterschied liegt. Gibt es ein Programm, das die Binärdaten von Unix nach Windows konvertiert?
Stellen Sie zunächst sicher, daß Sie die Dateien auch wirklich im Binär-Modus öffnen. Unter Unix ist das der Default, unter Visual C muß der Parameter `b´ (binary) jedoch explizit angegeben werden. Zudem ist die Byte-Order nicht betriebssystemspezifisch, sondern - außer bei Systemen mit einstellbarer Byte-Order - eine Eigenschaft der Hardware. Intel-CPUs (und kompatible) legen bei Wort-Zugriffen (2 Bytes) die einzelnen Bytes `andersrum´ ab, also least significant byte first. Unix aber läuft meist auf RISC-Rechner, und diese lesen das most significant Byte zuerst; daher das Mißverständnis. Linux auf Intel beispielsweise produziert die gleichen Binär-Dateien wie NT auf derselben Plattform. Wenn das Programm auf ein und derselben Hardware läuft, sollte das keine Probleme bereiten.
Unter Unix können Sie die Byte-Ordner einer Datei zum Beispiel mit `dd´ umstellen:
# dd if=./datei1 of=./datei2 conv=swab
Weitere Infos zu dd erscheinen, wenn Sie `man dd´ eingeben.
Das Problem läßt sich eventuell völlig umgehen, indem Sie die Daten vor dem Schreiben konsequent in `Network Byteorder´ umsortieren. Dies erfolgt mit Hilfe der Funktion htonl(). (ju) (ju)