Forum: PC-Programmierung Teil eines Array als int verwenden


von kronos (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von photon (Gast)


Lesenswert?

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;

von Klaus W. (mfgkw)


Lesenswert?

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...

von Detlef K. (adenin)


Lesenswert?

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.

von kronos (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.