2016-04-11 1 views
1

J'écris un programme C qui communique via Modbus TCP. J'envoie le flottant 3.14 sur mon client Modbus, avec une représentation hexadécimale de 0x4048F5C3. Mon code C reçoit correctement le paquet Modbus, et maintenant j'ai juste besoin de réinterpréter le unsigned char *buffer comme un flottant afin que je puisse obtenir la valeur 3.14. Voici mon codePuis-je spécifier l'endianness lors de la réinterprétation en tant que float?

int main() 
{ 
    setup_modbus_tcp(); 
    unsigned char buffer[4] = { 0x00, 0x00, 0x00, 0x00 }; 
    get_modbus_data(buffer, 4); 
     //Buffer now holds { 0x40, 0x48, 0xF5, 0xC3 }; 
    float value = *(float *)buffer; 
     //value is now -490.564453 
} 

Maintenant, je peux dire que ce problème est dû au fait de boutisme, parce que si j'échange boutisme de sorte que le tampon ressemble à ceci:

{ 0xC3, 0xF5, 0x48, 0x40 }; 

alors tout fonctionne très bien. Mais cela semble un peu brouillon. Dois-je échanger l'endianness? Ou est-il un moyen que je peux préciser boutisme quand je fais:

float value = *(float *)buffer; 
+0

Soit vous avez à échanger tous les octets ou vous envoyer le flotteur sous forme de chaîne ASCII imprimée. –

+0

Même après échange de byte: Êtes-vous sûr que la représentation est identique? – Olaf

+0

@Olaf Oui, après échange de byte, c'est définitivement correct. Il y a une différence mineure à cause de la précision en virgule flottante, mais à part ça, c'est juste. – DJMcMayhem

Répondre

2

Le tampon doit être manipulée manuellement, cela inclut des modifications à boutisme. Une fonction peut toujours être utilisée pour convertir le tampon en un format à virgule flottante.

float value = Convert(buffer); 

Pour ajouter, vous façon de convertir la mémoire tampon est incorrect:

float value = *(float *)buffer; 

Un tableau de caractères non signés ne peut pas être simplement un type float, car il provoque un comportement non défini. La mémoire doit être copié sur un objet de type float:

float value; 
memcpy(&value , buffer , sizeof(value)); //assumes endianness has already been handled