endianness
-
hi
ich habe nach dem thema endianness gegoogled, fand aber oft lösungen spezifisch für msvc++, was mir natürlich nicht gefällt.
was ich tun möchte: ein windows-bitmap generieren. in der dateiformat-spezifikation steht drin, dass die zahlen nach little-endian-konversion gespeichert werden sollen. kann ich vielleicht sogar einen wrapper für einen long machen, der - sofern er an einen stream gegeben wird - little-endianness garantiert? mfg
-
Da du ein Windows-Bitmap generieren willst, ist es möglich, dass die Datei nur auf Windows benutzt wird? Dann kannst du davon ausgehen, dass der integer bereist in little endian ist.
Für einen BigEndian Prozessor musst du die bytes manuell tauschen. Ich habe dazu das gefunden, du solltest es aber noch anpassen (macros durch überladene Funktionen ersetzen).
#define bswap_16(X) ((((X)&0xFF) << 8) | (((X)&0xFF00) >> 8)) #define bswap_32(X) ( (((X)&0x000000FF)<<24) | (((X)&0xFF000000) >> 24) | (((X)&0x0000FF00) << 8) | (((X) &0x00FF0000) >> 8))
-
dau123 schrieb:
kann ich vielleicht sogar einen wrapper für einen long machen, der - sofern er an einen stream gegeben wird - little-endianness garantiert?
Ja - das geht mit einem selbst gebauten Stream, der binär schreibt - Beispiel hier und da.
-
hmm, da ich selbst natürlich mit klassen arbeite und diese bislang auch mit dem opterator<< ausgegeben werden, gefällt mir werners lösung schon eher. danke
-
gerade noch eine folgefrage zum selben thema:
da der streambuf einen char erwartet (der leider signed ist), ist das verhalten denn definiert wenn ich z.b. einen wert wie 200 da "reinpresse"?
-
Marthog schrieb:
Für einen BigEndian Prozessor musst du die bytes manuell tauschen. Ich habe dazu das gefunden, du solltest es aber noch anpassen (macros durch überladene Funktionen ersetzen).
#define bswap_16(X) ((((X)&0xFF) << 8) | (((X)&0xFF00) >> 8)) #define bswap_32(X) ( (((X)&0x000000FF)<<24) | (((X)&0xFF000000) >> 24) | (((X)&0x0000FF00) << 8) | (((X) &0x00FF0000) >> 8))Sowas sollte man nicht machen. Wenn man eine bestimmte Endianess erzwingen möchte, kann man das portabel über die Shift-Operatoren erreichen. Siehe auch http://commandcenter.blogspot.de/2012/04/byte-order-fallacy.html.