Word in zwei bits verteilen

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
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"
Gast
Das kommt wiederum wie die Bytes im Speicher verteilt sind. Wenn sie 
auseinander stehen, musst du kopieren, wenn sie zusammen und in der 
richtigen Reihenfolge sind, siehe "union"
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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.