Comment transformer une chaîne binary en float ou en double?

Dans cette question, Bill The Lizard demande comment afficher la représentation binary d’un float ou d’un double .

Ce que j’aimerais savoir, c’est que, dans le cas d’une chaîne binary de longueur appropriée, comment effectuer l’opération inverse (en C #) En d’autres termes, comment transformer une chaîne binary en float ou en double?

En remarque, y a-t-il des chaînes de bits qui ne donneraient pas un float ou un double valide?


EDIT: Par chaîne binary, je veux dire une chaîne de 0 et de 1.

Donc, mon entrée sera une chaîne comme ceci:

01010101010101010101010101010101 

et ma sortie devrait être un nombre à virgule flottante. (Ou, s’il y avait 64 bits dans la chaîne, un double.)

 ssortingng bstr = "01010101010101010101010101010101"; long v = 0; for (int i = bstr.Length - 1; i >= 0; i--) v = (v << 1) + (bstr[i] - '0'); double d = BitConverter.ToDouble(BitConverter.GetBytes(v), 0); // d = 1.41466386031414E-314 
 double d1 = 1234.5678; ssortingng ds = DoubleToBinarySsortingng(d1); double d2 = BinarySsortingngToDouble(ds); float f1 = 654.321f; ssortingng fs = SingleToBinarySsortingng(f1); float f2 = BinarySsortingngToSingle(fs); // ... public static ssortingng DoubleToBinarySsortingng(double d) { return Convert.ToSsortingng(BitConverter.DoubleToInt64Bits(d), 2); } public static double BinarySsortingngToDouble(ssortingng s) { return BitConverter.Int64BitsToDouble(Convert.ToInt64(s, 2)); } public static ssortingng SingleToBinarySsortingng(float f) { byte[] b = BitConverter.GetBytes(f); int i = BitConverter.ToInt32(b, 0); return Convert.ToSsortingng(i, 2); } public static float BinarySsortingngToSingle(ssortingng s) { int i = Convert.ToInt32(s, 2); byte[] b = BitConverter.GetBytes(i); return BitConverter.ToSingle(b, 0); } 

Voici une solution qui n’utilise pas BitConverter et n’est pas limitée par la plage de Int64 .

 static double BinarySsortingngToDouble(ssortingng s) { if(ssortingng.IsNullOrEmpty(s)) throw new ArgumentNullException("s"); double sign = 1; int index = 1; if(s[0] == '-') sign = -1; else if(s[0] != '+') index = 0; double d = 0; for(int i = index; i < s.Length; i++) { char c = s[i]; d *= 2; if(c == '1') d += 1; else if(c != '0') throw new FormatException(); } return sign * d; } 

Cette version prend en charge les chaînes binarys représentant les valeurs comsockets entre Double.MinValue et Double.MaxValue , soit 1023 chiffres binarys significatifs. Il déborde dans Double.PositiveInfinity ou Double.NegativeInfinity .

La réponse de @LukeH ne prend en charge que les chaînes binarys représentant des valeurs comsockets entre Int64.MinValue et Int64.MaxValue , ou 63 chiffres binarys significatifs.

Pourquoi vous auriez besoin d'une chaîne binary de plus de 63 chiffres, c'est un sujet de discussion.

Si vous ne souhaitez pas autoriser un caractère de signe de tête, vous pouvez utiliser cette version simplifiée qui ne renvoie que des valeurs positives.

 static double BinarySsortingngToDouble(ssortingng s) { if(ssortingng.IsNullOrEmpty(s)) throw new ArgumentNullException("s"); double d = 0; foreach(var c in s) { d *= 2; if(c == '1') d += 1; else if(c != '0') throw new FormatException(); } return d; }