破解中遇到的问题,数据转换 00 00 00 40 == 2 ?

wang1st 2009-08-12 12:49:40
00 40 == 2
08 40 == 3
0C 40 == 3.5
14 40 == 5
18 40 == 6
22 40 == 9
24 40 == 10

各位,前面是HEX,后面是10进制。这到底是如何转换的啊?
...全文
249 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq1600356618 2009-08-12
  • 打赏
  • 举报
回复
先顶下
liuchangyu23 2009-08-12
  • 打赏
  • 举报
回复
IEEE754浮点数转换格式表示法

算法很简单,以 5 举例

0100 0000 1010 0000 0000 0000 0000 0000

bit31: 例如0,表示正数
bit30-23: 例如1000 0001: 129-127(固定算法)=2
bit22-0: 例如010 0000 0000 0000 0000 0000 在这之前加上1.变成如下
1.010 0000 0000 0000 0000 转换成十进制为1.2500000
所以这32位代表的十进制数为 2(基数)的2次方×1.2500000 = 5
其它的以此类推。

wang1st 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hpsmouse 的回复:]
引用 17 楼 wang1st 的回复:
是的啊 。这个是什么标准啊。还是软件开发者故意这样整的?
有人能说说吗?有人碰到过这样表示法的浮点数吗?

IEEE似乎没有这个标准,很明显他把指数变长了,尾数缩短了,应该是为了扩大表示范围吧。不过这样恐怕真的没有多少硬件支持了,要么用软件模拟,要么用专用硬件。不知你在哪里碰到的?
[/Quote]

这是我分析国外一个财务管理软件的数据格式时碰到的。
2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wang1st 的回复:]
是的啊 。这个是什么标准啊。还是软件开发者故意这样整的?
有人能说说吗?有人碰到过这样表示法的浮点数吗?
[/Quote]
IEEE似乎没有这个标准,很明显他把指数变长了,尾数缩短了,应该是为了扩大表示范围吧。不过这样恐怕真的没有多少硬件支持了,要么用软件模拟,要么用专用硬件。不知你在哪里碰到的?
wang1st 2009-08-12
  • 打赏
  • 举报
回复
是的啊 。这个是什么标准啊。还是软件开发者故意这样整的?
有人能说说吗?有人碰到过这样表示法的浮点数吗?
xingzhe2001 2009-08-12
  • 打赏
  • 举报
回复
看来前边多了3个bit
wang1st 2009-08-12
  • 打赏
  • 举报
回复
0100 0000 0000 0000 0000 0000 0000 0000 == 2
0100 0000 0000 0000 0000 0000 0000 0000

0100 0000 0000 1000 0000 0000 0000 0000 == 3
0100 0000 0100 0000 0000 0000 0000 0000

0100 0000 0000 1100 0000 0000 0000 0000 == 3.5
0100 0000 0110 0000 0000 0000 0000 0000

0100 0000 0001 0100 0000 0000 0000 0000 == 5
0100 0000 1010 0000 0000 0000 0000 0000

0100 0000 0001 1000 0000 0000 0000 0000 == 6
0100 0000 1100 0000 0000 0000 0000 0000

0100 0000 0010 0010 0000 0000 0000 0000 == 9
0100 0001 0001 0000 0000 0000 0000 0000

0100 0000 0010 0100 0000 0000 0000 0000 == 10
0100 0001 0010 0000 0000 0000 0000 0000

红色是IEEE的浮点数表示法,这样一看,基本就明白了。呵呵
xingzhe2001 2009-08-12
  • 打赏
  • 举报
回复
00 00 00 40 == 0
00 00 08 40 == 2
00 00 0C 40 == 3
00 00 14 40 == 5
00 00 18 40 == 6
00 00 22 40 == 9
00 00 24 40 == 10

感觉这样才对阿,右边的数是怎么得来的?
xingzhe2001 2009-08-12
  • 打赏
  • 举报
回复
转自http://blog.csdn.net/gates84/archive/2006/11/01/1360332.aspx

1、简介
目前已知的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE浮点数表示法来进行运算的。
这种结构是一种科学表示法,用符号(+或-)、指数和尾数来表示,底数被确定为2。
所以在IEEE浮点数表示法里,一个浮点数为尾数乘以2的指数次方再加上符号。

2、float规格
float 共计32位,4字节
由最高到最低位分别是第31、30、29、……、0位,则:
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。

3、转换例子
按照IEEE浮点数表示法,将float型浮点数12345.0f转换为二进制。
处理不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000 也可以这样表示:11110001001000000.0
然后将小数点向左移,一直移到离最高位只有1位:1.11100010010000000 共左移了16位,
所以原数就等于:1.11100010010000000 * ( 2^16 )。可知尾数为1.11100010010000000,指数为16。

显而易见,最高位永远是1,所以这个1没有必要保留。
这样尾数的二进制就变成了:11100010010000000
最后在尾数的后面补0,一直到补够23位:11100010010000000000000

来看指数,一共8位,可以表示范围是0 - 255的无符号整数,也可以表示-128 - 127的有符号整数。
因为指数是可以为负的,为了统一把十进制的整数化为二进制时,都先加上127。
这里,我们的16加上127后就变成了143,二进制表示为:10001111
12345.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:
0 10001111 11100010010000000000000
符号 指数 尾数
即:01000111 11110001 00100000 00000000


wang1st 2009-08-12
  • 打赏
  • 举报
回复
0100 0000 0000 0000 0000 0000 0000 0000 == 2
0100 0000 0000 1000 0000 0000 0000 0000 == 3
0100 0000 0000 1100 0000 0000 0000 0000 == 3.5
0100 0000 0001 0100 0000 0000 0000 0000 == 5
0100 0000 0001 1000 0000 0000 0000 0000 == 6
0100 0000 0010 0010 0000 0000 0000 0000 == 9
0100 0000 0010 0100 0000 0000 0000 0000 == 10
wang1st 2009-08-12
  • 打赏
  • 举报
回复
重新整理一下
00 00 00 40 == 2
00 00 08 40 == 3
00 00 0C 40 == 3.5
00 00 14 40 == 5
00 00 18 40 == 6
00 00 22 40 == 9
00 00 24 40 == 10
wang1st 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hpsmouse 的回复:]
IEEE 浮点最少也是 32bit,更短的浮点不论是从精度上还是实现上都有难度(毕竟少有硬件支持)。
楼主在标题中写的是 32bit,帖子里又是 16bit,很乱……
麻烦楼主把数据写清楚,而且注明一下字节序(应该是 little-endian 吧)。
[/Quote]

各位抱歉。是32位的。只是我偷懒,只写了16位。
顺序是little-endian 的。
AbnormalSubmarine 2009-08-12
  • 打赏
  • 举报
回复
如果不是楼主写错,就是浮点转换的问题了。
2009-08-12
  • 打赏
  • 举报
回复
IEEE 浮点最少也是 32bit,更短的浮点不论是从精度上还是实现上都有难度(毕竟少有硬件支持)。
楼主在标题中写的是 32bit,帖子里又是 16bit,很乱……
麻烦楼主把数据写清楚,而且注明一下字节序(应该是 little-endian 吧)。
xingzhe2001 2009-08-12
  • 打赏
  • 举报
回复
16位的浮点?
wang1st 2009-08-12
  • 打赏
  • 举报
回复
我也感觉是某种浮点数,但是就是不清楚如何转换的。
ayw215 2009-08-12
  • 打赏
  • 举报
回复
这个貌似是浮点的二进制。。。
去找找ieee的浮点数的标准看看
wanghao111 2009-08-12
  • 打赏
  • 举报
回复
关注
luc_cj 2009-08-12
  • 打赏
  • 举报
回复
楼上说的有道理,但是着实看不出它到底是怎么转的呢
FancyMouse 2009-08-12
  • 打赏
  • 举报
回复
第1个字节高4位是0的时候步进1/8,1的时候步进1/4,2的时候步进1/2
这似乎是某种浮点

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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