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要怎样实现呢?我对熟制转换这部分很糊涂,希望大家帮帮忙了!!小妹在此谢过了!~
[解决办法]
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*/
[解决办法]
谢谢楼上,你的代码贴的太快了,我心里有压力,呵呵