Konvertiere einen float in 4 uint8_t

8

Ich habe eine float Variable , die ich über ein CAN-Protokoll senden muss. Um dies zu tun, muss dieser Float von 32 Bits in 4 uint8_t variables geschnitten werden.

Ich habe absolut keine Ahnung, wie es geht. Ich dachte zuerst daran, den Float in einen Int zu konvertieren, aber einige Antworten, die ich im Internet gefunden habe, die Cast oder Union verwenden, scheinen nicht zu funktionieren.

Hier ist ein einfaches Beispiel für das, was ich versuche:

%Vor%

Danke.

    
Evans Belloeil 19.08.2014, 14:48
quelle

4 Antworten

6

Normalerweise tust du dies, indem du den float auf ein Array von uint8_t wirfst.

In C kannst du es so machen:

%Vor%

in C ++ verwenden Sie die reinterpret_cast

%Vor%

Dann sind Array [0], ..., Array [3] Ihre Bytes.

    
dohashi 19.08.2014, 14:54
quelle
1

Sie können diese illegale Operation ausführen:

%Vor%

Obwohl dies die meiste Zeit funktioniert, wird es vom C ++ - Standard nicht unterstützt und Compiler erzeugen möglicherweise Code mit undefiniertem Verhalten.

Eine andere Lösung ist die Verwendung von Unionen:

%Vor%

Es ist unklar, ob alle Compiler konsistente Ergebnisse liefern, aber es scheint sicherer als der erste Ansatz.

Sie können auch den Wert von f in eine 32-Bit-Ganzzahl packen. Dies kann jedoch dazu führen, dass Sie ein wenig an Genauigkeit verlieren, aber je nachdem, wie genau f beibehalten werden soll, wäre dies die beste Lösung.

    
rashmatash 19.08.2014 15:00
quelle
1

Hier ist ein Union-Ansatz, der separate Namen für Integer-Teile anstelle von einem Array gibt:

%Vor%

Ich war anfangs besorgt, dass diese Verwendung von union gemäß dem Standard nicht streng legal ist: C ++ Undefiniertes Verhalten bei Unionen , aber das Argument von ComicSansMS in einem Kommentar zu rashmatashs Antwort ist überzeugend.

    
user2079303 19.08.2014 14:58
quelle
1

Zunächst sollten Sie beachten, dass der Standard für float keine spezifischen Größenbeschränkungen vorschreibt. Es ist möglich, dass ein float bei einer vorstellbaren Architektur nicht in vier Bytes passt (obwohl mir das nicht bekannt ist). Sie sollten mindestens (static_) bestätigen, dass es passt, bevor Sie etwas versuchen.

Dann denke ich, dass der einfachste Weg darin besteht, zu bestätigen, dass CHAR_BIT ist 8 , und benutze das legale Aliasing zu unsigned char* mit reinterpret_cast :

%Vor%

Dies ignoriert jedoch vollständig das Endian-Problem. Vielleicht möchten Sie also eine Kopie der Bytes erstellen, damit Sie das beheben können:

%Vor%     
Mark B 19.08.2014 16:18
quelle