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;
Soit vous avez à échanger tous les octets ou vous envoyer le flotteur sous forme de chaîne ASCII imprimée. –
Même après échange de byte: Êtes-vous sûr que la représentation est identique? – Olaf
@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