C#怎样把浮点数的十六进制化成十进制数

jack0558 2012-04-05 08:16:15
例如我有十六进制数:47 7A 45 C2,十进制数是:-49.3694 ;如何用C# 把他化成十进制数?求具体代码
...全文
769 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
80donet 2013-11-26
  • 打赏
  • 举报
回复
引用 7 楼 dalmeeme 的回复:
这样就行了:
		string s = "477A45C2";
MatchCollection matches = Regex.Matches(s, @"[0-9A-Fa-f]{2}");
byte[] bytes = new byte[matches.Count];
for (int i = 0; i < bytes.Length; i++)
bytes[i] = byte.Parse(matches[i].Value, NumberStyles.AllowHexSpecifier);
float m = BitConverter.ToSingle(bytes, 0);
Response.Write(m);

输出:
-49.36941


请教个问题,我从下位机接收到500组数据存到了一个字符串数组中,我解析的时候直接转换成十进制的,显示的全是正数,但下位机那边反馈应该有负数的,截图中的arrText[]是直接从下位机返回的数据,DataArea[]是最终解析好的数据组。请问怎么改?
orochiheart 2012-04-06
  • 打赏
  • 举报
回复
string str16 = this.textBox2.Text;
if (str16 == "") {
return;
}
if ((!str16.StartsWith("0x")) || (!str16.StartsWith("0X")))
{
str16 = "0X" + str16;
}
int n16 = (int)Convert.ToUInt32(str16.Trim(), 16);
string n10 = Convert.ToString(n16,10);
Mirror然 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我现在用这种方法可以实现:
C# code
byte[] bytes = new byte[4];
bytes[0] = 0x47;
bytes[1] = 0x7A;
bytes[2] = 0x45;
bytes[3] = 0xC2;
float m = BitCon……
[/Quote]

第一 。net 自带的有转换函数
第二 如果单纯的只为了转化某个16进制 你就直接转了 要么你就写个转换的方法
jack0558 2012-04-06
  • 打赏
  • 举报
回复
我现在用这种方法可以实现:
   byte[] bytes = new byte[4];
bytes[0] = 0x47;
bytes[1] = 0x7A;
bytes[2] = 0x45;
bytes[3] = 0xC2;
float m = BitConverter.ToSingle(bytes, 0);

但是现在不知道如何将"477A45C2"这个字符串拆开到各个byte[]中去?还要在前面加个0x?
传递正能量 2012-04-06
  • 打赏
  • 举报
回复
0x代表着后面要写的是16进制数据,而不是10进制
orochiheart 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

这样就行了:
C# code
string s = "477A45C2";
MatchCollection matches = Regex.Matches(s, @"[0-9A-Fa-f]{2}");
byte[] bytes = new byte[matches.Count];
for (int i = 0; i < byte……
[/Quote]
哦也! 太牛了 顶个
dalmeeme 2012-04-06
  • 打赏
  • 举报
回复
这样就行了:
		string s = "477A45C2";
MatchCollection matches = Regex.Matches(s, @"[0-9A-Fa-f]{2}");
byte[] bytes = new byte[matches.Count];
for (int i = 0; i < bytes.Length; i++)
bytes[i] = byte.Parse(matches[i].Value, NumberStyles.AllowHexSpecifier);
float m = BitConverter.ToSingle(bytes, 0);
Response.Write(m);

输出:
-49.36941
chen_ya_ping 2012-04-05
  • 打赏
  • 举报
回复
Convert.ToDecimal("477A45C2",16)
试试。
Mirror然 2012-04-05
  • 打赏
  • 举报
回复

void short(char s[]) //数组s[]里面存放键盘输入的16进制数
{
int n=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}

传递正能量 2012-04-05
  • 打赏
  • 举报
回复
只帮你找到这些


浮点数在计算机内存中的存储格式

对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit,我们在声明一个变量float f = 2.25f的时候,是如何分配内存的呢?其实不论是float类型还是double类型,在计算机内存中的存储方式都是遵从IEEE的规范的,float 遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

无论是单精度还是双精度,在内存存储中都分为3个部分:
1) 符号位(Sign):0代表正,1代表为负;
2) 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;
3) 尾数部分(Mantissa):尾数部分;

R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制 的科学计数法表示就为:8.25* 10^0,而120.5可以表示为:1.205*10^2。而我们傻蛋计算机根本不认识十进制的数据,它只 认识0和1,所以在计算机内存中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示 为:1110110.1。用二进制的科学计数法表示1000.01可以表示为1.00001*2^n ,1110110.1可以表示为 1.1101101* 2^n,任何一个数的科学计数法表示都为 1.xxx*2^n , 尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数 点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了, 所以指数部分的存储采用移位存储,存储的数据为元数据+127。
下面就看看8.25和120.5在内存中真正的存储方式:
首先看下8.25,用二进制的科学计数法表示为:1.0001* 2^3
按照上面的存储方式,符号位为0,表示为正;指数位为3+127=130,位数部分为 1.00001,故8.25的存储方式如下:
0xbffff380: 01000001000001000000000000000000
分解如下:0--10000010--00001000000000000000000
符号位为0,指数部分为10000010,位数部分为 00001000000000000000000
同理,120.5在内存中的存储格式如下:
0xbffff384: 01000010111100010000000000000000
分解如下:0--10000101--11100010000000000000000
那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值 呢?其实就是对上面的反推过程,比如给出如下内存数据:
01000001001000100000000000000000
第一步:符号位为0,表示是正数;
第二步:指数位为10000010,换算成十进制为130,所以指数为130-127=3;
第三步:尾数位为01000100000000000000000,换算成十进制为 (1+1/4+1/64);
所以相应的十进制数值为:2^3*(1+1/4+1/64)=8+2+1/8=10.125

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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