十六进制到十进制数头痛

时间:2016-03-04 15:15:02

标签: php objective-c ieee-754

我对一系列字节如何变成十进制数字感到困惑。

当我记录(NSData *)data1的值时,我得到:

(lldb) po data1
<00000000 207ce340 62706c69 73743030 d4000100 02000300 04000500 0612c012 c1582476 ... ...> 

前8个字节应该包含一个数字,代码提取如下:

memcpy(&doubleNumber, [data1 bytes], sizeof(double));

data1的前8个字节(我猜是00000000 207ce340,对吗?)如何给出十进制数 39905 ??

修改

这个问题的上下文需要在PHP中进行转换:给定十六进制表示,如何在PHP中转换数字并获得小数(实际上它应该是 float )39905 ?

这个问题的答案在下面的一条评论中。

1 个答案:

答案 0 :(得分:3)

使用维基百科,以及各种在线端和IEEE 754转换器,我相信我对你的问题有一个答案,“数据1的前8个字节(我猜是00000000 207ce340,对吗?)如何给出十进制数39905 ?“

00000000207ce340  Your starting value

40e37c2000000000  Switch to Big Endian to simplify following analysis

sign (leading) bit = 0  i.e. (0)100 in binary
exponent = 0x40e = 1038
IEEE 754 exponent bias = 1023
fraction = 0x37c2000000000 / 2**52 = 980901810929664 / 2**52

value = 2**(exponent − exponent bias) × (1.0 + fraction)

value = 2**(1038 - 1023) * (1.0 + (980901810929664 / 2**52))

value = 39905.0

或者在Unix dc中:

16 k
2 1038 1023 - ^ 1.0 980901810929664 2 52 ^ / + * p
39905.0000000000000000