Hallo Leute, ich habe ein Word(16Bit) und möchte diese Daten in zwei Bytes verteilen, mit Hilfe von C. Kennt jemand solche Befehle? Gruß Steve
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
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"
|
> Word in zwei bits verteilen ich glaube das geht! http://de.wikipedia.org/wiki/Microsoft_Word ,vielmehr isses nicht. :)
jep. Die Sache mit der Verpointerung und die union sind gute Ideen :-)
upps soory habe bytes gemeint. Und wie mache ich aus zwei Bytes eine Word?
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.
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
> 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
Hallo Marcin, diese Syntax mit dem : kannte ich noch gar nicht. Geht das echt? Gruß heinz
Hallo Heinz, http://en.wikipedia.org/wiki/C_syntax#Bit_fields hier kannst Du die kleine 'Lücke' in der Syntax wieder schliessen ... Martin
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.