Convertir un float de 4 u_int8_t
J'ai un float
variable que j'ai besoin d'envoyer par le biais d'un protocole can. Pour ce faire, ce flotteur de 32 bits doit être coupé dans 4 uint8_t
variables.
Je n'ai absolument aucune idée de comment le faire. J'ai d'abord été pensée de convertir le float en int mais quelques réponses que j'ai trouvé sur Internet qui utilisent la fonte ou de l'union ne semble pas fonctionner.
Voici un exemple simple de ce que je suis en train de faire :
float f;
uint8_t ut1,ut2,ut3,ut4;
//8 first bits of f into ut1
//8 second bits of f in ut2
...
//Then I can send the uint8_t through CAN
...
Grâce.
Ne voulez-vous pas
Aussi montrer le code que vous utilisez et une certaine idée de la méthode que vous appelez (c'est à dire sa sémantique).
J'ai besoin de 4 différents variable distincte si possible , mais un onglet peut être ok. Je n'ai pas le code de bonne à vous montrer ... seul test avec des acteurs et de l'union
double de stackoverflow.com/questions/21005845/how-to-get-float-bytes stackoverflow.com/questions/18270974/... stackoverflow.com/questions/3991478/... stackoverflow.com/questions/7157301/... ...
uint8_t[4]
au lieu de 4 * uint8_t
variables?Aussi montrer le code que vous utilisez et une certaine idée de la méthode que vous appelez (c'est à dire sa sémantique).
J'ai besoin de 4 différents variable distincte si possible , mais un onglet peut être ok. Je n'ai pas le code de bonne à vous montrer ... seul test avec des acteurs et de l'union
double de stackoverflow.com/questions/21005845/how-to-get-float-bytes stackoverflow.com/questions/18270974/... stackoverflow.com/questions/3991478/... stackoverflow.com/questions/7157301/... ...
OriginalL'auteur Evans Belloeil | 2014-08-19
Vous devez vous connecter pour publier un commentaire.
Normalement, vous faites ceci en jetant le flotteur à un tableau de u_int8_t.
En C, vous pouvez le faire comme ceci:
en C++ utilise le reinterpret_cast
Puis tableau[0], ..., tableau[3] sont vos octets.
Il peut être endianess, mais c'est vrai, cependant, nous avons divisé le flotteur en octets. Je dirais que c'est une question distincte. Quel que soit le protocole spécifie les OP devront respecter.
OriginalL'auteur dohashi
D'abord vous devriez noter que la norme n'impose aucune restriction de taille sur
float
. Il est possible qu'unfloat
ne rentre pas dans les quatre octets sur certains imaginables architecture (bien que je ne suis pas au courant de tout). Vous devriez au moins (static_)affirment qu'il fit avant de tenter quoi que ce soit.Alors je pense que le plus simple est d'affirmer que
CHAR_BIT
est8
, et l'utilisation de l'juridique de l'aliasing àunsigned char*
avecreinterpret_cast
:Cet ignore totalement les endian question, cependant, de sorte que peut-être ce que vous voulez vraiment est de faire une copie des octets de sorte que vous pouvez corriger cela:
OriginalL'auteur Mark B
Vous pouvez faire cette opération illégale:
Bien que cela fonctionne la plupart du temps, il n'est pas pris en charge par le c++ standard et les compilateurs peuvent générer du code avec un comportement indéterminé.
Une autre solution est d'utiliser des syndicats:
Il est difficile de savoir si tous les compilateurs de produire des résultats uniformes, mais il semble plus sûre que la première approche.
Vous pouvez également emballer la valeur de
f
dans un entier de 32 bits. Ceci, cependant, peut entraîner la perte d'un peu de précision, mais en fonction de la précision avec laquelle vous voulez garderf
, ce serait la meilleure solution.Techniquement, la lecture à partir d'un syndicat différent de la dernière écriture est un comportement indéfini. Cependant, tous les principaux compilateurs C++ à donner la garantie que cela fonctionnera correctement. C'est toujours la bonne réponse, comme il n'existe pas de standard conforme façon de le réaliser autrement.
Ah, merci pour la restauration de ma foi dans le
union
.OriginalL'auteur rashmatash
Voici une approche de l'union qui donne des noms différents pour entier pièces au lieu d'un tableau:
Au départ, j'étais inquiète de ce que cette utilisation de
union
n'est pas strictement juridique selon la norme: C++ comportement Indéfini avec les syndicats mais ComicSansMS de l'argument dans un commentaire à rashmatash la réponse est convaincante.OriginalL'auteur eerorika