日期:2014-05-18  浏览次数:21559 次

C#将二进制小数byte[]型转换成double型,请大家帮帮忙!
假定三个字节放在byte[] data={0x03,0xDF,0xCF},详细的分别为(这是一位名为gomoku的朋友给出的解释):
0 1 2
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- + E E E E E s s s s s s s s s s s s s s s s s

0 0 0 0 0 0 1 1 (03)
1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 (DF CF)




第一位 (-) 是这个数的符号,0为正,
第二位(+) 是指数的符号,
EEEEEE 是指数,
ss...s 是小数部分. (一个 1 通常被加做前缀变为 1.sssssssssssssssss)

例如:
03 DF CF = (+)1.1101111111001111 ^( +000011 ) = 1.8742523193359375^3 = 6.58

我想用C#编程将上面的byte[]型数组data换成double型结果x要怎样实现呢?我对熟制转换这部分很糊涂,希望大家帮帮忙了!!小妹在此谢过了!~


------解决方案--------------------
C# code
using System;

class Program
{
  static void Main()
  {
    byte[] data = { 0x03,0xDF,0xCF };
    Console.WriteLine(ToSingle3(data, 0));
  }
  
  // 返回由字节数组中指定位置的三个字节转换来的单精度浮点数。
  static float ToSingle3(byte[] value, int startIndex)
  {
    if (value == null) throw(new ArgumentNullException());
    if (startIndex < 0 || startIndex > value.Length - 3) throw(new ArgumentOutOfRangeException());
    double t = 1;                           // 尾数
    double s = 0.5;
    byte b = value[startIndex + 1];
    for (int i = 0; i < 8; i++)
    {
      if ((b & 0x80) != 0) t += s;
      b <<= 1;
      s  /= 2;
    }
    b = value[startIndex + 2];
    for (int i = 0; i < 8; i++)
    {
      if ((b & 0x80) != 0) t += s;
      b <<= 1;
      s  /= 2;
    }
    b = value[startIndex];
    int sign0 = (b & 0x80) == 0 ? 1 : -1;   // 尾数的符号
    int sign1 = (b & 0x40) == 0 ? 1 : -1;   // 指数的符号
    int E = (b & 0x3F) * sign1;             // 指数
    return (float)(Math.Pow(t, E) * sign0);
  }
}
/* 程序输出:
6.583914
*/

------解决方案--------------------
谢谢楼上,你的代码贴的太快了,我心里有压力,呵呵