Word in zwei bits verteilen

#1239161
Lesenswert?

Hi,
1
tydef union
2
{
3
  unsigned char b[2];
4
  unsigned int w;
5
}
6
converter;

word zu bytes:
1
unsigned int word = 0xFABA;
2
converter conv;
3
conv.w = word;
4
//nun steht in "w" dein word, lesen tust du es mittels b[];
5
also:
6
unsigned char byte1 = conv.b[0];
7
unsigned char byte2 = conv.b[1];

bytes zu word:
1
converter conv;
2
conv.b[0] = byte1;
3
conv.b[1] = byte2;
4
//nun steht in "b's" dein word, lesen tust du es mittels "w"; 
5
unsigned int word = conv.w;

Viel Spaß damit.
#1239229
Lesenswert?

Sumynona wrote:
> jep. Die Sache mit der Verpointerung und die union sind gute Ideen :-)

Ich denke nicht. Die "Verpointerung" ist ein schlimmes Beispiel 
nicht-portabler Programmierung - man tritt sich für nichts eine schöne 
Abhängigkeit vom Bytesex der CPU ein (little- oder big-endian). Toll.

Wenn Du sicher sein willst, wo im Ergebnis das low- und wo das highbyte 
steht unabhängig von der CPU, dann verwende die shift-Variante.

-Michael
Gast #1239255
Lesenswert?

> ich hänge mich hier einfach mal ran. Habe folgendes "Problem":
> ein Wert vom Typ uint32_t, der aber nur Werte zw. 0 und 100000 annehmen
> kann (3 byte genügen), möchte ich zusammen mit einem uint8_t Wert in
> einem uint32_t speichern. Wie mach ich das am elegantesten?

Hi heinz,

für Deinen ersten Wert (100000) brauchst Du 17 Bits.
Du hast dann noch 7 Bits zur freien Verfügung...

das kannst Du mit einer Struktur erledigen:

1
struct data{
2
  uint8_t            byteWert;
3
  uint32_t           intWert      :17;
4
  uint8_t            freieBits    :7
5
};


Gruß

Martin

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