Word in zwei bits verteilen

#1238983
Lesenswert?

Oh ja, das ist garnicht einmal so schwer.

Es gibt in C sogenannte "Shift Operatoren", außerdem auch noch logische 
Operationen wie z.B. die "Und Verknüpfung".
1
uint16_t mein_word;
2
uint8_t mein_high_byte, mein_low_byte;
3
mein_high_byte = mein_word >> 8;
4
mein_low_byte = mein_word & 0x00FF;

Matthias
Gast #1238984
Lesenswert?

Ungetested, gibt mehrere Varianten.
1
// input word
2
unsigned short input = 0xABCD;
3
unsigned char *byte;
4

5
byte = (unsigned char *)&input;
6

7
// byte[0] jetzt gleich "CD"
8
// byte[1] jetzt gleich "AB"
#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.
Gast #1239217
Lesenswert?

Hi,
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?

Danke und Gruss
#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