Teil eines Array als int verwenden

Gast #3605991
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
Gast #3606038
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;
#3606076
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...
#3606195
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.
Gast #3606470
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren