2015-06-24 2 views
2

Я пытаюсь отправить некоторые двойные в дейтаграмме через udpSendSocket. Данные поступают из графического интерфейса QT и отправляются в драйверную программу VS2013 (как на C++). Я использую QDataStream для размещения данных в QByteArray, который затем отправляется. Все отлично работает для целых чисел, но я не могу заставить его работать в парном разряде.reinterpret_cast - double to char [] to double not working - C++

Я уже подтвердил, что мой код передачи работает так, что все, что находится в дейтаграмме, принимается программой драйвера, поэтому я выполняю все свое тестирование в программе QT.

Сначала я отправил двойное прямо в QDataStream, который утверждает, что использует IEEE 754, а затем использовал * reinterpret_cast, чтобы преобразовать его обратно в double.

// QT Program 
QByteArray datagram; 
QDataStream out(&datagram, QIODevice::WriteOnly); 
out.setVersion(QDataStream::Qt_5_1); 
out.setFloatingPointPrecision(QDataStream::SinglePrecision); 

double test = 0.3; 
out << test; 
double recv = *reinterpret_cast<double*>(&datagram); 

С этим recv = 2.32e-317.

После этого не сработало, я сосредоточился на попытке преобразования двоичного массива в байтовый массив обратно в double. Несколько источников привели меня к мысли, что это сработает, но это не так.

double test = 0.3; 
unsigned char const* bytes = reinterpret_cast<unsigned char const*>(&test); 
double recv = *reinterpret_cast<double*>(&bytes); 

С этим recv = 1.33e-317.

SizeOf (двойной) возвращает 8.

Что я делаю неправильно с reinterpret_cast? Должен ли я делать это преобразование по-другому? Какие-либо предложения?

Благодаря

+0

Спасибо AndyG и Angew. Оба ваших ответа были очень полезными. – Doggman9

ответ

3

Вы не хотите reinterpret_cast&bytes, но bytes. Первый - это адрес указателя, последний - значение (на что указывает), где находится ваш double.

Кроме того, приведение к unsigned char*, не unsigned char* const, так что вы не разбрасывать резюме отборочные

double test = 0.3; 
unsigned char* bytes = reinterpret_cast<unsigned char*>(&test); 
double recv = *reinterpret_cast<double*>(bytes); 
std::cout << recv << std::endl; 

Выход:

0,3

Live Demo

0

В ваш interpret_cast Например, вы принимаете указатель на bytes, который уже является указателем на байты данных и литье на указатель на двойной. Если вы разыгрываете bytes вместо, а также приведён к const double* (потому что reinterpret_cast не откинутой константность) он будет работать:

double recv = *reinterpret_cast<const double*>(bytes); 
2

@AndyG правильно о bytes части. Что касается datagram: &datagram дает вам адрес объекта QByteArray, а не адрес его содержимого. Для этого вам необходимо data():

QByteArray datagram; 
QDataStream out(&datagram, QIODevice::WriteOnly); 
out.setVersion(QDataStream::Qt_5_1); 
out.setFloatingPointPrecision(QDataStream::SinglePrecision); 

double test = 0.3; 
out << test; 
double recv = *reinterpret_cast<double*>(datagram.data());