C#将二进制小数byte[]型转换成double型,请大家帮帮忙!

charun33 2008-06-06 07:59:52
假定三个字节放在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要怎样实现呢?我对熟制转换这部分很糊涂,希望大家帮帮忙了!!小妹在此谢过了!~
...全文
1699 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuadam 2008-06-07
  • 打赏
  • 举报
回复
谢谢楼上,你的代码贴的太快了,我心里有压力,呵呵
wuyi8808 2008-06-06
  • 打赏
  • 举报
回复
哦,直接这样就好了,“ ? true : false ”是没必要的:
           bool flag1 = tmp1[0] == '1';      //符号
bool flag2 = tmp1[1] == '1'; //指数符号

wuyi8808 2008-06-06
  • 打赏
  • 举报
回复
To: fuadam

你的HtoS可以简化如下:
        //16进制转2进制字符串
public static string HtoS(int num)
{
return Convert.ToString(num, 2).PadLeft(8, '0');
}



另:指数符号应该是 tmp[1],而不是 tmp[0]:
            bool flag2 = tmp1[1] == '1' ? true : false;      //指数符号
fuadam 2008-06-06
  • 打赏
  • 举报
回复
//用来计算符号,指数符号,和指数
=================================
这个注释错误请忽略
fuadam 2008-06-06
  • 打赏
  • 举报
回复
楼上好快啊,我就贴下我的代码吧:

//16进制转2进制字符串
public static string HtoS(int num)
{
string tmp = Convert.ToString(num, 2); //用来计算符号,指数符号,和指数
if (tmp.Length < 8)
tmp = new string('0', 8 - tmp.Length) + tmp;
return tmp;
}
public static void Main()
{
string tmp1 = HtoS(0x03);
bool flag1 = tmp1[0] == '1' ? true : false; //符号
bool flag2 = tmp1[0] == '1' ? true : false; //指数符号
//指数
int power = Convert.ToInt32(tmp1.Substring(2, 6), 2);
if (flag2)
power = 0 - power;

//小数部分
string tmp2 = HtoS(0xDF) + HtoS(0xCF);
double decimal_fraction = 1;
for (int i = 0,j=-1; i < 16; ++i,--j)
{
decimal_fraction += Convert.ToInt32(tmp2[i].ToString()) * Math.Pow(2, j);
}
double result = Math.Pow(decimal_fraction, power);
if (flag1)
result = 0 - result;
Console.WriteLine(result);
}

wuyi8808 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 charun33 的回复:]
你就行行好帮我贴上具体代码吧^_^
我刚接触C#,很多东西都不懂,谢谢你啦!!~
[/Quote]
[Quote=引用 10 楼 charun33 的回复:]
你告诉我代码后我给你加分OK?
[/Quote]

楼主失踪了?
wuyi8808 2008-06-06
  • 打赏
  • 举报
回复
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
*/
charun33 2008-06-06
  • 打赏
  • 举报
回复
你告诉我代码后我给你加分OK?
fuadam 2008-06-06
  • 打赏
  • 举报
回复
不用说的这么客气,你出分我出代码,平等交易,哈哈
charun33 2008-06-06
  • 打赏
  • 举报
回复
你就行行好帮我贴上具体代码吧^_^
我刚接触C#,很多东西都不懂,谢谢你啦!!~
fuadam 2008-06-06
  • 打赏
  • 举报
回复
有个比较笨的方法,你先把这个3个字节拼接成string,然后
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
判断-位,然后拿到ssss那些小数部分,转换成float类型,然后拿到eeee指数部分,然乎利用Math类计算指数,得到最后的值,不用我贴具体代码了吧
charun33 2008-06-06
  • 打赏
  • 举报
回复
恩,我这个数据是从一个化学仪器输到串口的,它的说明书上是这样解释数据格式的,上面算出的那个6.58是PH值。我刚在MSDN上查了BitConverter,好像只能将四字节的byte[]转换成float
fuadam 2008-06-06
  • 打赏
  • 举报
回复
3字节的?
charun33 2008-06-06
  • 打赏
  • 举报
回复
是我理解错了,gomoku之前告诉过我common float number is 32bit or 64bit long (see IEEE-745 standard).
我的这个是24 bit float is not common and might require your own manipulation.
我不应该转成double型,应该是float型
fuadam 2008-06-06
  • 打赏
  • 举报
回复
double怎么是3个字节

如果是正常的8字节byte 可以使用BitConvert转成double
charun33 2008-06-06
  • 打赏
  • 举报
回复
不好意思,本来写的时候上下字符是对齐的,结果提交后就有点乱了,1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 是对应着从第二个字节开始到第三个字节结束的
charun33 2008-06-06
  • 打赏
  • 举报
回复
上面的有一点问题,修改如下:
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 E 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)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧