Вот решение, которое не использует BitConverter и не ограничено диапазоном Int64 .
static double BinaryStringToDouble(string s)
{
if(string.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;
}
Эта версия поддерживает двоичные строки, которые представляют значения от Double.MinValue до Double.MaxValue или 1023 значащих двоичных цифр. Он переполняется до Double.PositiveInfinity или Double.NegativeInfinity .
@ LukeH ответ поддерживает только двоичные строки, представляющие значения от Int64.MinValue до Int64.MaxValue или 63 значащих двоичных цифр.
Почему вам нужна бинарная строка длиной более 63 цифр, обсуждается.
Если вы не хотите разрешить символ начального знака, вы можете использовать эту более простую версию, которая возвращает только положительные значения.
static double BinaryStringToDouble(string s)
{
if(string.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;
}