WORD in zwei BYTE zerlegen
-
WORD a = 0x000d; BYTE B0 = ((BYTE*)&a)[0]; BYTE b1 = ((BYTE*)&a)[1];Mit den neuen casts bin ich mir nie so ganz sicher, Wahrscheinlich so
BYTE B0 = reinterpret_cast<BYTE*>(&a)[0]; BYTE B1 = reinterpret_cast<BYTE*>(&a)[1];
-
Du solltest deine Zeiger dann aber auch noch dereferenzieren. Also so:
BYTE B0 = *(reinterpret_cast<BYTE*>(&a)[0]); BYTE B1 = *(reinterpret_cast<BYTE*>(&a)[1]);(Bin mir jetzt nicht sicher, ob die Klammern wirklich nötig sind - wahrscheinlich nicht.)
Bei der C-Variante fehlt ebenfalls noch die Dereferenzierung.
-
Der Meister schrieb:
Du solltest deine Zeiger dann aber auch noch dereferenzieren. Also so:
BYTE B0 = *(reinterpret_cast<BYTE*>(&a)[0]); BYTE B1 = *(reinterpret_cast<BYTE*>(&a)[1]);(Bin mir jetzt nicht sicher, ob die Klammern wirklich nötig sind - wahrscheinlich nicht.)
Bei der C-Variante fehlt ebenfalls noch die Dereferenzierung.Muss ich nicht ( macht das [] ) nur verkehrt ist's.
WORD a = 0x0a0d; BYTE B0 = ((BYTE*)&a)[1]; BYTE b1 = ((BYTE*)&a)[0]; BYTE B0 = reinterpret_cast<BYTE*>(&a)[1]; BYTE B1 = reinterpret_cast<BYTE*>(&a)[0];
-
Ah, ja, hast recht. Ein Grund mehr, solchen Code zu meiden: Man täuscht sich leicht

-
Hast recht man täuscht sich leicht
so stimmts jetzt wirklich#include <iostream> #include <iomanip> typedef unsigned short WORD; typedef unsigned char BYTE; int main() { WORD a = 0x000d; BYTE b0 = ((BYTE*)&a)[0]; BYTE b1 = ((BYTE*)&a)[1]; BYTE B0 = reinterpret_cast<BYTE*>(&a)[0]; BYTE B1 = reinterpret_cast<BYTE*>(&a)[1]; std::cout << std::hex << std::setfill('0') << "0x" << std::setw(2) << (int)B0 << " 0x" <<std::setw(2) << std::setfill('0') << (int)B1 << std::endl; std::cout << std::hex << std::setfill('0') << "0x" << std::setw(2) << (int)b0 << " 0x" <<std::setw(2) << std::setfill('0') << (int)b1 << std::endl; }mein output
0x0d 0x00 0x0d 0x00
-
was haben c++ programmierer nur gegen c casts? sind diese templatecasts irgendwie besser?
-
c.rackwitz schrieb:
was haben c++ programmierer nur gegen c casts? sind diese templatecasts irgendwie besser?
Angeblich sind sie absichtlich so grauslich ( die neuen ) damit man sich leichter tut sie zu vermeiden.

-
du machst ja windows ne? da gibbets macros für: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmacros/lobyte.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmacros/hibyte.asp
-
c.rackwitz schrieb:
was haben c++ programmierer nur gegen c casts? sind diese templatecasts irgendwie besser?
Ja.
-
Leute - egal wie man castet - alt oder neu - die Lösung, den Pointer auf WORD auf Pointer auf BYTE zu casten ist nicht portable. Da geht es los mit little- und big-endian. Je nach Prozessor steht an der ersten Byteposition das höher- oder niederwertige Byte. Soweit ich mich erinnere steht nei little-endian steht das niederwertigste Byte zuerst, bei big-endian das höherwertige. Aber da das so schwer zu merken ist und das sowieso nicht portabel ist, einfach die Ursprüngliche Lösung mit Maskieren und Shiften nehmen. Das stimmt dann immer.
Tommi