Hallo, ich möchte zwei Bytes in zwei 4Bitwerte umwandeln und dann in einem Byte speichern. Hat jemand einen Vorschlag wie ich das am einfachsten in C bewerkstelligen kann. Um die 8Bit in 4Bit zu verwandeln kann ich sie ja einfach durch 2 teilen. Nur wie bekomme ich die beiden dann wieder zusammen in ein Byte? Jetzt schonmal Danke für eure Hilfe!
Hallo, wenn du 255 (0b1111 1111) durch 2 teilst (div) erhälst du doch 128 (0b0111 1111), was mehr als 4bit Daten enthält. Das Zusammenfügen geht mit & und | mit entsprechenden Shifts (>> und <<). Marcus
@Marcus: Ein Teilen von 255 durch 2 ist das Gleiche wie ein einzelnes Rechtsshift. Dabei kommt 127 heraus... @Sascha: Wie sollen die Zahlen denn aussehen? Um das obere Nibble (höherwertige 4 Bits) zu erhalten, shiftet man viermal nach rechts (x>>4). Fertig. Um das untere Nibble zu erhalten verundet man mit 0x0F. (x & 0x0F) Fertig. Was möchstest du denn genau machen?
char byte1,byte2,byte3 byte3=(byte1&0x0f)<<4 | (byte2&0x0f); die low-nibbles von beiden bytes werden damit low bzw high-nibble von byte3
Also nochmal etwas genauer, ich möchte 2 8Bit Werte aus dem ADC lesen und diese dann per Infrarot übertragen, ich brauche aber keine 8Bit Auflösung bei den Werten. Um die Packete für die IR-Übertragung möglichst klein zu halten möchte ich deshalb die 2 Werte beim senden in einen zusammenfassen und beim Empfänger die Werte wieder auseinanderdröseln.
Was für 2x 8 Bit Werte vom ADC? Zwei unterschiedliche, von zwei verschiedenen Messungen, oder ein High und ein Low Byte von einer Messung?
Ich verstehe das jetzt mal so, dass Du von zwei Messungen je einen ADC-Wert in 8 Bit hast, wobei Dir 4 Bit Auflösung für die Übertragung genügen. D.h. Du willst die High-Nibbles der zwei Bytes in einem einzigen Byte speichern und verschicken, um sie am anderen Ende wieder in zwei einzelne Bytes zu zerlegen. Also auf Senderseite z.B.: unsigned char ADWert1, ADWert2, SendeByte; //...irgendwas... SendeByte = (ADWert1 & 0xF0) | (ADWert2 >> 4); Auf Empfängerseite: unsigned char ADWert1, ADWert2, EmpfangByte; //...irgendwas... ADWert1 = EmpfangByte & 0xF0; ADWert2 = EmpfangByte << 4;
Dann müsste johnnys Lösung funktionieren. Beachte aber, dass du bei dieser Variante nur noch 4-Bit Auflösung hast (Sprich: 16 "Spannungsstufen")
> dass du bei dieser Variante nur noch 4-Bit Auflösung hast
Naja, er sagt doch, das reicht ihm, gell?
Vielen Dank vorerst mal an alle, ich glaube ich teste das mal mit dem ansatz von johnny.m. Ich muß eh erstmal testen ob die 4Bit Auflösung wirklich ausreichend sind oder ob ich mich da verkalkuliert hab. THX Sascha
Danke inoffz..., man hätte das binäre, das ja stimmt auch mal gegenrechnen können. Marcus
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.