Hallo, ich habe eine für euch wahrscheinlich banale Frage. wenn ich eine Variable habe in der ein Wert abgelegt ist z.B. i=0x0344 Wie kann ich diese Variable so aufsplitten dass ich zwei werte habe. Z.B i1=0x03 und i2=0x44 und welche möglichkeit gibt es diese später wieder zu einer variablen, zb x=0x0344 wieder zusammenzuführen? Danke für Eure Hilfe
:
Verschoben durch User
Anfänger schrieb: > Wie kann ich diese Variable so aufsplitten dass ich zwei werte habe. > Z.B i1=0x03 und i2=0x44 > und welche möglichkeit gibt es diese später wieder zu einer variablen, > zb x=0x0344 wieder zusammenzuführen? > Danke für Eure Hilfe wie trennst du denn die Zahl 12 (also 1 und 2 )im Kopf? Genauso kann geht auch im Computer. Dafür gibt es Funktionen "ganzzahlige Division" und "Modulo".
Beschreibe doch mal was du mit den beiden Teilen machen willst, dann können wir vielleicht gleich mehrere Fliegen mit einer Klapppe erschlagen .....
Ich möchte die Variable sozusagen über den CAN eines STM32F4 verschicken, mit einem anderen empfangen und dann wieder zusammensetzen.
Das geht mit Bitmaskierung ! (und ich glaube ich habe gerade mein eigenes Problem gelösst !) Beispiel aus einem meiner Codes: message.data[0] = (iTemp32 & 0x000000ff); message.data[1] = (iTemp32 & 0x0000ff00) >> 8; message.data[2] = (iTemp32 & 0x00ff0000) >> 16; message.data[3] = (iTemp32 & 0xff000000) >> 24; Bei dir dürfte das dann so aussehen: message.data[0] = (i & 0x00ff); message.data[1] = (i & 0xff00) >> 8; Grüße, Souko
Wow, vielen Dank! Also das "auseinanderreissen der Variable in zwei Teile und das Versenden über CAN funktioniert. Jetzt steh ich allerdings vor dem Problem die zwei Teile wieder zu einem zusammenzuführen. Gibts da auch einen Trick wie mit der Bitmaskierung?
Witzig, ein ähnliches problem hatte ich gerade: Beitrag "Verständnissprobleme Bitmaske und Verknüpfung" Hier wurde mir schnell und kompetent geholfen ! Bin auch noch ein wenig Anfänger, und hab ab und an Probleme mit nicht ganz so häufigen Anwendungen ! Dazu gehört auch das zusammen setzen von Daten ;-)
Hallo... Ich würde es ganz einfach so machen: (x ist das höherwertige Byte, y ist das niederwertige Byte. In z steht dann die zusammengefügte 16 Bit Variable) z = (x << 8) | y; Grüße
:
Bearbeitet durch User
Ganz ohne Rechenaufwand (und damit wesentlich schneller) geht es auch über einen union:
1 | union |
2 | { |
3 | struct { |
4 | unsigned char l; |
5 | unsigned char h; |
6 | } byte; |
7 | unsigned short s; |
8 | } data; |
9 | |
10 | data.s = 0x1234; |
11 | printf("0x%04x -> h: 0x%02x l: 0x%02x\n", data.s, data.byte.h, data.byte.l); |
12 | |
13 | data.byte.h = 0x56; |
14 | data.byte.l = 0x78; |
15 | printf("h: 0x%02x l: 0x%02x -> 0x%04x\n", data.byte.h, data.byte.l, data.s); |
liefert: 0x1234 -> h: 0x12 l: 0x34 h: 0x56 l: 0x78 -> 0x5678
Joe F. schrieb: > Ganz ohne Rechenaufwand (und damit wesentlich schneller) geht es auch > über einen union: > liefert: > 0x1234 -> h: 0x12 l: 0x34 > h: 0x56 l: 0x78 -> 0x5678 aber nicht überall. Es liefert auf Little-Endian etwas anders als auf Big-Endian. Das ist murks. Und schneller ist es auch nicht.
Joe F. schrieb: > liefert: > 0x1234 -> h: 0x12 l: 0x34 > h: 0x56 l: 0x78 -> 0x5678 Muss nicht so sein, hängt von der Endianness ab. Deswegen kann man diesen Code auch verwenden um herauszufinden ob man auf einer Big- oder Litte-Endian Maschine arbeitet.
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.