Forum: Compiler & IDEs Umwandlung von 16 Bit in 8 Bit


von LtData (Gast)


Lesenswert?

Hallo!

Ich möchte gerne einen 32 Bit Wert vom Typ uint32_t übertragen und zwar 
über 8 I/O Pins. Also müsste ich die Variable in 4 vom Typ uint8_t 
splitten.
Wie mache ich das am besten?

Vielen Dank!

von Christian Schifferle (Gast)


Lesenswert?

union {
uint23_t u32;
uint8_t u8[4];
} x;

// 32-Bit Wert einschreiben:
x.u32 = <irgend ein wert>;

// Die 8-Bit Werte auslesen
a = x.u8[0];
a = x.u8[1];
a = x.u8[2];
a = x.u8[3];

Es geht auch über bit shift befehle, aber mit unions ist es viel 
komfortabler.

Gruss
Christian

von Benno Müller (Gast)


Lesenswert?

Geht das eigentlich auch, wenn man einen signed long hat und diese in 4 
unsigned chars wandeln möchte?

also etwa so in der art:

  union
  {
    long s32;
    unsigned char u8[4];
  } x;

was ist das LSB und was das HSB?

von Christian Schifferle (Gast)


Lesenswert?

Logisch, du musst bloss aufpassen, wo das Vorzeichenbit bei der 
long-Komponente liegt. Üblicherweise ist dies das höchstwertige Bit.

HSB = Höchstwertiges Bit bzw. Byte, wird meistens jedoch als MSB (Most 
Significant Bit) bezeichnet.
LSB = Niederwertigestes Bit bzw. Byte (Lowest significant Bit).

Zur Erklärung:
Wenn du die Dezimalzahl 4712 anschaust, dann ist 2 das niederwertigste 
und 4 das höchstwertigste Zeichen. Genau so geht es auch mit Binärzahlen 
und anderen Zahlensystemen.

Gruss
Christian

von Benno Müller (Gast)


Lesenswert?

> HSB = Höchstwertiges Bit bzw. Byte, wird meistens
> jedoch als MSB (Most Significant Bit) bezeichnet.
> LSB = Niederwertigestes Bit bzw. Byte (Lowest
> significant Bit).

Klar, nur wo liegt dieses im Array?

ist x.u8[0] das niederwertigste bit, oder das höherwertigste?

von Christian Schifferle (Gast)


Lesenswert?

Hängt davon ab, wie long-Werte im Zielsystem abgebildet werden.
Die union legt einfach die verschiedenen Variablendeklarationen 
übereinander. So gesehen wird wahrscheinlich u8[0] das höchstwertige 
Byte bezeichnen.
Ich würde es aber zuerst sicherheitshalber mal ausprobieren.
Setze dazu x.s32 = 0x12345678
uind lies danach die 4 Bytes aus, dann weisst du genau wie dieselben im 
Speicher abgelegt sind. Die einzelnen Werte der vier Bytes x.u8[0] bis 
x.u8[3] betragen 0x12, 0x34, 0x56 und 0x78.

Gruss
Christian

von Benno Müller (Gast)


Lesenswert?

Gute Idee! Habs ausprobiert und festgestellt das in x.u8[0] das HSB 
steckt, wie du schon sagtest.

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.