2015-05-08 4 views
0

Я прочитал из сокета некоторые шестнадцатеричные данные. Спецификация этого протокола говорит мне, что следующие 8 байтов представляют двойное значение.Преобразование 8 байтов в двойное значение

Так что я, например, 8 байт, как:

0x3F 0xD1 0x9B 0x94 0xC0 0x00 0x00 0x00 

(Это значение сохраняется в массив символов, так Array[0] = 0x3F, `Array [1] = 0xD1è ...)

представляемого двойной значение: 0.275120913982

Как я могу преобразовать эти 8 байтов в это двойное значение?

Я пробовал много разных вещей, но ничего не работает. Поэтому я понятия не имею, как я могу манипулировать им до двойника.

+0

Вы проверили, нужно ли выполнять преобразование большого конца в малочисленное? – user1978011

+1

* «Я пробовал много разных вещей, но ничего не работает. Поэтому я понятия не имею, как я могу манипулировать им до двойника». * - это отчасти ожидается, что вы покажете нам, что вы пробовали и на самом деле объясните, что произошло и как это не сработало, и что вы не понимаете в чем причина. Во всяком случае, это легко: 'double d; memcpy (& d, & a [0], sizeof d); ' –

ответ

2

Вы можете использовать союз, это работает для меня:

#include <iostream> 
using namespace std; 

int main() { 
    union { char b[8]; double d; }; 
    b[7] = 0x3F; 
    b[6] = 0xD1; 
    b[5] = 0x9B; 
    b[4] = 0x94; 
    b[3] = 0xC0; 
    b[2] = 0x00; 
    b[1] = 0x00; 
    b[0] = 0x00; 

    cout << "Double: " << d << endl; 

    return 0; 
} 

Пожалуйста, обратите внимание, обратный порядок байтов. Это зависит от сущности и может отличаться на вашей машине. Во всяком случае, он выдает:

Double: 0.275121 
+0

здесь применяется обычный классификатор о типе-punning, так как он указан тег C++. –

Смежные вопросы