Ich habe ein Array, das mir per TTL übermittelt wird. Nun möchte ich die hinteren beiden bytes verwenden, um einen Status zu definieren. Dazu möchte ich gerne switch case verwenden uint8_t status[5] = { 0x0F, 0x00, 0x38, 0x14, 0x01 }; int status = 1401; ist das Ziel Wie mache ich das? Danke
kronos schrieb: > int status = 1401; ist das Ziel Wahrscheinlich 0x1401? irgendwas = status[3]<<8 | status[4]; Wenn das Feld schon status heißt, kann man denselben Namen nicht nochmal für das Ergebnis nehmen.
Hallo kronos, du kannst die beiden Bytes einfach zu nem int zusammenbauen, wie es Klaus schreibt, oder du machst es mit einer union: Byte Order muss aber passen.
1 | typedef union { |
2 | uint8_t status_bytes[5]; |
3 | struct { |
4 | uint8_t status_bytes[3]; |
5 | uint16_t status_int; |
6 | }xxx; |
7 | |
8 | } T_KRONOS_STATUS; |
9 | |
10 | T_KRONOS_STATUS status; |
11 | |
12 | status.status_bytes[3] = 0x14; |
13 | status.status_bytes[4] = 0x01; |
14 | status.xxx.status_int = 0x1401; |
union kann aber schief gehen, nämlich dann wenn auf der jeweiligen Architektur eine short auf einer geraden Adresse liegen muß. Das gesamte Feld wird an einer geraden Adresse liegen, status[3] tut es dann gerade nicht. Dadurch entfällt auch die Möglichkeit mit kreativen Zeigerspielereien...
Das müsste eigentlich alle Fallstricke berücksichtigen:
1 | int irgendwas = ( (int)status[3]<<8 | (int)status[4] & 0x0FF ) & 0xFFFF; |
Doof ist natürlich, das der TO nicht erwähnt, wie größ "int" ist, und ob der "status" auf "int" vom Vorzeichen her erweitert werden soll. Naja, das übliche "Ich sehe was, was Du nicht siehst"-Spielchen eben.
Klaus Wachtler schrieb: > kronos schrieb: >> int status = 1401; ist das Ziel > > Wahrscheinlich 0x1401? > > irgendwas = status[3]<<8 | status[4]; > > Wenn das Feld schon status heißt, kann man denselben Namen nicht nochmal > für das Ergebnis nehmen. Das funktioniert sehr gut und gibt den Wert als Dezimalzahl aus. Jetzt muss ich nur die bekannten Hex-Werte zu Dezimal umwandeln und ich kann daraus switch cases machen. Danke
kronos schrieb: > Das funktioniert sehr gut und gibt den Wert als Dezimalzahl aus. Jetzt > muss ich nur die bekannten Hex-Werte zu Dezimal umwandeln Nein, musst du nicht. Du kannst Hexwerte und auch Zeichen angeben, wenn ein Integer-Literal gebraucht wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.