Question

Je lis des données sur une prise. Les types de données intégrales sont sans problème, les méthodes de System.BitConverter sont le bon déroulement de la conversion. (Donc, il n'y a pas de problèmes Endian à se soucier, je pense?)

Cependant, BitConverter.ToDouble ne fonctionne pas pour les parties à virgule flottante des données ... la spécification source est un peu faible pour moi, mais parle d'une représentation de point fixe binaire avec un octet décalage positif dans plus direction significatif et négatif octet de décalage dans la direction moins importante.

La plupart des recherches que je l'ai fait a été visant à C ++ ou une bibliothèque complète de point fixe et la manipulation Sines cosinus, qui sonne comme surpuissant pour ce problème. Quelqu'un pourrait-il me aider s'il vous plaît une fonction C # pour produire un flotteur à partir de 8 octets d'un tableau d'octets avec, par exemple, un octet de -3 décalage?

D'autres détails du format requis:

La valeur numérique signée de données en virgule fixe est représentée en utilisant binaire complément à deux notation.For données à virgule fixe, la valeur de chacun des paramètres de données sont définies par rapport à l'octet de référence. L'octet de référence définit un champ de huit bits, avec l'unité de mesure dans la position de bit de poids faible. La valeur du bit de poids faible de l'octet de référence est UN. Décalage d'octet est définie par un entier signé indiquant la position de l'octet le moins significatif d'un élément de données par rapport à l'octet de référence. Le MSB de l'élément de données représente le bit de signe. Les positions de bits entre le bit MSB de la paramètre valeur absolue et le MSB de l'octet le plus significatif est égal à la valeur du bit de signe.

données à virgule flottante doivent être représentés comme un numéro de binaire en virgule flottante en conformité avec la norme IEEE Std ANSI / IEEE 754-2008. (Cette phrase est d'une autre section qui peut être un hareng rouge).

Était-ce utile?

La solution

Ok, après avoir posé quelques questions d'un expert local du matériau source, il se trouve CodeInChaos était sur la bonne voie ... si la valeur est de 8 octets avec un décalage d'octets -3, alors je peux utiliser BitConverter.ToInt64 / 256 ^ 3, si elle est de 4 octets avec un décalage d'octet -1 puis BitConverter.ToInt32 / 256 produira la réponse correcte. Je suppose que cela signifie BitConverter.ToXXX où XXX est signé est assez intelligent pour gérer les calculs complément à deux!

Merci à tous ceux qui ont essayé de l'aider, je pensais que ce ne pouvait pas être trop compliqué, mais obtenir que 256 décalage par rapport à la formulation du document de référence a été très confus: -)

Autres conseils

System.BitConverter fonctionne très lent, donc si la performance est importante pour vous, je vous recommande de convertir octets int par vous-même (via des changements logiques). En outre, s'il vous plaît préciser dans quels flotteurs format exact sont envoyés dans votre protocole.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top