2016-03-04 3 views
0

Я смущен относительно того, как серия байтов превращается в десятичное число.Головная боль от шестнадцатеричного до десятичного числа

Когда я вхожу значение (NSData *) data1 я получаю:

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

Первые 8 байт должны содержать номер, который кодовые экстракты следующим образом:

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

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

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

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

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

+2

Существует целая большая спецификация, которая рассказывает, как число кодируется: https://en.wikipedia.org/wiki/IEEE_floating_point – Sulthan

+1

Знаете ли вы как число кодируется в байтовом потоке (т. е. большой конец или маленький конец)? Знаете ли вы, какой формат 'NSData' печатает его содержимое? Использование 'double' для хранения байта очень необычно, так как вы не можете иметь частичные байты, поэтому вся схема кодирования может быть ошибочной. – trojanfoe

+0

Я вижу ... это намного сложнее, чем я думал. @Sulthan, я не знаю, как использовать документ iEEE Floatation Point. – Sleiman

ответ

3

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

Спасибо @cdlane! Это впечатляющая часть вычислений. Я действительно искал простой код (в PHP), и следующие два оператора делают это: '$ binarydata64 = pack ('H *', '00000000207ce340'); $ float64 = unpack ("d", $ binarydata64); ' – Sleiman

+0

Но это не ваш вопрос, @Sleiman. PHP появляется только в одном комментарии (до этого.) Что люди, которые приходят на эту страницу, на основе поиска, ожидают найти, поскольку PHP не является частью названия, ни вопроса, ни тегов? Даже если бы я не ожидал вопроса, о котором вы должны были спросить, это хороший ответ тому, который вы спросили?(Не пойму ли я, чтобы ответить на вопрос, который я лично думаю, кто-то должен был спросить, а не тот, который они на самом деле сделали?) – cdlane

+0

У вас есть хороший момент, @cdlane. Я отредактирую вопрос соответствующим образом. Я боюсь, что не могу, хотя ваш ответ должен быть правильным, потому что мне нужно будет проверить его правильность, и это потребует времени и усилий, которых у меня нет на данный момент. Тем не менее, вы получаете +1 от меня за свои усилия. – Sleiman