Hallo Freunde, ich bekomme von einem Sensor 4 Byte á 8 Bit, also insgesammt 32 Bit ausgebenen. zB. (Binär ) 01000011000100010000011010101111 (Dezimal) 65 232 7 66 (Float ) 145,0261 Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich, allerdings möchte ich das in einem C Programm machen lassen. Hat einer von euch einen Algorithmus der ein Array mit 4 Intzahlen an eine Funktion übergibt und einen Float als Rückgabewert zurück bekommt? Oder kann man das ganze einfacher lösen?? Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus zwei 8Bit Integern ;) Danke im Vorraus Maxxe
Maxxe schrieb: > Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich, > allerdings möchte ich das in einem C Programm machen lassen. dann kläre uns erst mal darüber auf wie das geht, denn eigentlich kann man das nicht umrechnen. kann es sein das die 4byte schon float sind? Dann kann man sie einfach in ein float kopieren
1 | uint8_t data[4]; |
2 | float f; |
3 | |
4 | memcpy( &f, data, sizeof(float) ); |
Maxxe schrieb: > Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich, > allerdings möchte ich das in einem C Programm machen lassen. Dann weißt du auch, dass sich der Standard IEEE 754 dahinter versteckt. Unter diesem Stichwort findest du mit einer Suchmaschine deiner Wahl auch genug Beispiele und Referenzimplementierungen. Von welcher Plattform sprechen wir hier eigentlich? Gibt es eine FPU, oder möchtest du die Fließzahlen wirklich in Software abhandeln? Maxxe schrieb: > Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus > zwei 8Bit Integern ;) Diese Anfrage verstehe ich leider nicht. Was genau hat das Zweierkomplement jetzt mit o.g. Fließkommazahlen zu tun? Was hat es mit den 8 Bit Integern auf sich? Mit freundlichen Grüßen, Karol Babioch
Peter II schrieb: > Maxxe schrieb: >> Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich, >> allerdings möchte ich das in einem C Programm machen lassen. > > dann kläre uns erst mal darüber auf wie das geht, denn eigentlich kann > man das nicht umrechnen. http://de.wikipedia.org/wiki/IEEE_754 Habs nachgerechnet.. Das passt soweit. Peter II schrieb: > kann es sein das die 4byte schon float sind? Dann kann man sie einfach > in ein float kopieren > uint8_t data[4]; > float f; > > memcpy( &f, data, sizeof(float) ); Die 4 Byte sind uint8_t. Aber mit deiner memcpy Methode Funktion scheint es nicht zu funktionieren :( Karol Babioch schrieb: > Maxxe schrieb: >> Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus >> zwei 8Bit Integern ;) > > Diese Anfrage verstehe ich leider nicht. Was genau hat das > Zweierkomplement jetzt mit o.g. Fließkommazahlen zu tun? Was hat es mit > den 8 Bit Integern auf sich? Das hat auch nichts mit einander zu tun. Das sind zwei verschiedene Probleme. Ich möchte aus 4 uint8_t Byte einen float machen. Und des weiteren aus 2 uint8_t ein 16Bit zweier Komplimentzahl.
Maxxe schrieb: > Die 4 Byte sind uint8_t. Aber mit deiner memcpy Methode Funktion scheint > es nicht zu funktionieren :( wenn die 4byte float sind muss es klappen, da muss nichts gerechnet werden. Eventuell Reihenfolge tauschen.
Maxxe schrieb: > Aber mit deiner memcpy Methode Funktion scheint > es nicht zu funktionieren :( Was heißt "scheint nicht zu funktionieren"? Hast du die Reihenfolge der einzelnen Bytes beachtet (Little Endian vs Big Endian)? Maxxe schrieb: > Und des weiteren aus 2 uint8_t ein 16Bit zweier Komplimentzahl. Das lässt sich zwar prinzipiell alles mit ein paar Bitoperationen hinbiegen (Bytes in eine uint16_t Variable schreiben, dabei höherwertiges Byte um 8 nach links shiften. Anschließend mit dem ~ (Tilde) Operator alle Bits invertieren, und anschließend noch 1 hinzuadieren), mich würde es aber wundern, wenn dein Problem dies tatsächlich erfordert. Vielleicht gehst du das Ganze nur falsch an? Was genau hast du denn vor? Mit freundlichen Grüßen, Karol Babioch
Karol Babioch schrieb: > Maxxe schrieb: >> Aber mit deiner memcpy Methode Funktion scheint >> es nicht zu funktionieren :( > > Was heißt "scheint nicht zu funktionieren"? Hast du die Reihenfolge der > einzelnen Bytes beachtet (Little Endian vs Big Endian)? Genau das war mein Fehler wie ich grad bemerkt hab xD Klappt also doch ;) Sahne Typen seid Ihr !! Die kleine Funktion memcpy hat mir nen Haufen Arbeit erspaart ;) Nun muss ich mal nen bissl rumzaubern das ich nun noch auf meine Zweierkomplimentzahl komme ;)) Aber das sollte doch dann auch mit der memcopy gehn oder nicht? xDD
Maxxe schrieb: > Nun muss ich mal nen bissl rumzaubern das ich nun noch auf meine > Zweierkomplimentzahl komme ;)) > Aber das sollte doch dann auch mit der memcopy gehn oder nicht? xDD Nein, da sind o.g. Bitmanipulationen (bzw. eine Addition) sinnvoller. Ungetestet:
1 | uint16_t convert(uint8_t a, uint8_t b) |
2 | {
|
3 | |
4 | return (~((a << 8) | b) + 1); |
5 | |
6 | }
|
Die Frage ist aber nach wie vor: Warum brauchst du solche Low-Level Operationen? Ich könnte mir gut vorstellen, dass du dich hier verrennst und die falschen Probleme zu lösen versuchst. Mit freundlichen Grüßen, Karol Babioch
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.