Головная боль от шестнадцатеричного до десятичного числа

Я не понимаю, как ряд байтов превращается в десятичное число.

Когда я регистрирую значение (NSData *) data1, я получаю:

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

Предполагается, что первые 8 байтов содержат число, которое код извлекает следующим образом:

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

Как сделать первые 8 байтов (которые, я думаю, 00000000 207ce340да?) из data1 дают десятичное число 39905 ??

редактировать

В контексте этого вопроса необходимо выполнить преобразование в PHP: учитывая шестнадцатеричное представление, как в PHP можно преобразовать число и получить десятичное число (на самом деле это должно быть поплавок) 39905?

Ответ на этот вопрос в одном из комментариев ниже.

0

Решение

Используя Википедию и различные онлайн-конвертеры с прямым порядком байтов и IEEE 754, я полагаю, что у меня есть ответ на ваш вопрос: «Как первые 8 байтов (я полагаю, 00000000 207ce340, верно?) Data1 дают десятичное число 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
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]