C# 如何将二进制字符串转换为float或double?

C# 如何将二进制字符串转换为float或double?,c#,binary,floating-point,double,C#,Binary,Floating Point,Double,在这个问题上,蜥蜴比尔问道 我想知道的是,给定一个适当长度的二进制字符串,我如何执行反向操作(在C#中)?换句话说,如何将二进制字符串转换为浮点或双精度 作为旁注,是否有任何位字符串不会导致有效的浮点或双精度 编辑:二进制字符串是指0和1组成的字符串 因此,我的输入将是如下所示的字符串: 01010101010101010101010101010101 我的输出应该是一个浮点数。(或者,如果字符串中有64位,则为双精度)。与中相同,您需要再次使用位转换器: 字符串bstr=“01010

在这个问题上,蜥蜴比尔问道

我想知道的是,给定一个适当长度的二进制字符串,我如何执行反向操作(在C#中)?换句话说,如何将二进制字符串转换为浮点或双精度

作为旁注,是否有任何位字符串不会导致有效的浮点或双精度


编辑:二进制字符串是指0和1组成的字符串

因此,我的输入将是如下所示的字符串:

01010101010101010101010101010101
我的输出应该是一个浮点数。(或者,如果字符串中有64位,则为双精度)。

与中相同,您需要再次使用
位转换器:

    • 字符串bstr=“01010101010101010101”;
      长v=0;
      
      对于(inti=bstr.Length-1;i>=0;i--)v=(v这里有一个解决方案,它不使用,也不受范围的限制


      你可以使用指针吗?然后你可以适当地填充位模式。如果有帮助的话,我可以给你一个C答案。你应该更具体地说明“二进制字符串”,因为不存在这样的东西。你是指带有十六进制表示的字符串吗?二进制字符串是什么意思?0和1的负载,或者其他一些表示形式?你能给出一个ex吗有足够的预期输入和输出?@KerrekSB这似乎是一种冗长的处理方式,但谢谢。@Henkholtman抱歉,我认为这是一个很好理解的术语。
      位转换器的核心是使用指针-以下是反射器的
      ToDouble
      return*((double*)&ToInt64(value,startIndex)))
      应该附带一个“不要在家里这样做”警告,因为这在C中是完全未定义的行为。可能C#实现依赖于对编译器的一些假设。我不认为字符串
      aabbcc
      会以任何有意义的方式变成双精度。@KerrekSB可能C#实现依赖于C#规范。@phoog:C#specifica是什么关于类型双关和严格的别名规则呢?
      string 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;
      string ds = DoubleToBinaryString(d1);
      double d2 = BinaryStringToDouble(ds);
      
      float f1 = 654.321f;
      string fs = SingleToBinaryString(f1);
      float f2 = BinaryStringToSingle(fs);
      
      // ...
      
      public static string DoubleToBinaryString(double d)
      {
          return Convert.ToString(BitConverter.DoubleToInt64Bits(d), 2);
      }
      
      public static double BinaryStringToDouble(string s)
      {
          return BitConverter.Int64BitsToDouble(Convert.ToInt64(s, 2));
      }
      
      public static string SingleToBinaryString(float f)
      {
          byte[] b = BitConverter.GetBytes(f);
          int i = BitConverter.ToInt32(b, 0);
          return Convert.ToString(i, 2);
      }
      
      public static float BinaryStringToSingle(string s)
      {
          int i = Convert.ToInt32(s, 2);
          byte[] b = BitConverter.GetBytes(i);
          return BitConverter.ToSingle(b, 0);
      }
      
      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;
      }
      
      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;
      }