我对一系列字节如何变成十进制数字感到困惑。
当我记录(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 ?
这个问题的答案在下面的一条评论中。
答案 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