Hexwert in 2 Byte aufteilen..
-
Also, ich habe folgendes Problem, ich habe eine int Variable. In diese Variable schreibe ich im Programm einen Zahlenwert, konkret einen Hex wert mit 2 Byte..
z.B.
int i; i=16308;//entspricht einem Hex wert von 3FB4 printf("I in Hex = %x",i);
Mein Problem besteht darin, das ich nun diesen Hex wert auf 2 Byte aufteilen muss
Praktisch soll das Ergebniss mal so aussehen:int k,j; k=0x3F; j=0xB4;
Meine erste Idee war die Integer Zahl in einen Char umzuwandeln.. das funktioniert auch
char output[4]; int i; i=16308; sprintf(output, "%x", i);
Der nächste Schritt wäre das Char Feld in 2 Felder zu trennen
das im ersten Feld eben 3F und im zweiten 4B steht
und das dann wieder in einen Int zu wandeln, aber das bekomme ich nicht hin....Ich hoffe jemand hat eine gute Idee...
Danke schon mal im Vorraus....
-
Hast du schonmal etwas von Bit-Operatoren (&, |, >>, <<) gehört? Die sind hier ideal:
int i=0x1234 int low = i & 0xFF; //ergibt 0x34 int high= (i&0xFF00)>>8;/*oder*/int high=(i>>8)&0xFF; //ergibt 0x12 int i2 = high<<8 | low;
-
WOW, erst mal Danke für die schnelle Antwort...
Ich programmiere schon eine Weile in C und C++ aber die Operatoren hab ich bisher nur in Und bzw Oder abfragen verwendet.
allerdings fehlt mir noch das Verständniss,
was genau passiert in der Zeileint low = i & 0xFF;
Definition eines int names Llow ist klarm ihm weise ich eine Wert zu
aber was genau bewirkt das& 0xFF
-
CStoll schrieb:
int high= (i&0xFF00)>>8;/*oder*/int high=(i>>8)&0xFF; //ergibt 0x12
Zweiteres ist besser, ein int kann ja auch 2 Bytes groß sein und bei negativen Integern ist nicht spezifiziert ob nun arithmetisch oder logisch geshiftet wird.
-
bigborre schrieb:
allerdings fehlt mir noch das Verständniss,
was genau passiert in der Zeileint low = i & 0xFF;
Definition eines int names Llow ist klarm ihm weise ich eine Wert zu
aber was genau bewirkt das& 0xFF
& ist das binäre UND - d.h. alle Bits werden einzeln mit UND kombiniert, 0xFF ist 11111111(binär) (die niedrigsten 8 Bit gesetzt, alle höheren gelöscht). Insgesamt werden durch
i&0xFF
genau die untersten 8 Bit aus i rausgesucht.(zum Verständnis der nächsten Zeile: Der Shift-Operator i>>8 schiebt den Inhalt von i um 8 Bit nach rechts - die untersten 8 Bit wandern in den Müll, die nächstfolgenden füllen diese Lücke auf (und ganz oben werden entweder Nullen oder Kopien des Vorzeichens reingeschoben, um den int-Wert aufzufüllen))
-
Ok, ich danke euch für die klasse Antworten, schau mir das jetzt noch mal in ruha an bis ich es richtig gerafft hab...
-
Hmm ich denke mal ich hab die Funktionsweise einigermaßen durchblickt?
Müßte das ganze dann nicht anders herrum auch irgendwie funktionieren?
z.B.
int i=0x12; int j=0x34; int k= ?
also das ich beide so zusammenführe, dass
k=0x1234;
?
Ginge so etwas?
-
Klar (Erklärung inline):
int i=0x12; int j=0x34; int k= (i << 8) // i um acht Bit nach links, das ist dann 0x1200 | // logisches ODER - in diesem speziellen Fall ginge auch eine Addition mit + j // da wir 0x1200 und 0x34 verODERn, kommt raus: // 0x1200 // 0x0034 // ------ // 0x1234
-
Es funktioniert .. DANKE!!