Russian Qt Forum

Qt => Общие вопросы => Тема начата: max1983 от Февраль 28, 2011, 02:37



Название: double to 8 byte - QByteArray
Отправлено: max1983 от Февраль 28, 2011, 02:37
Простая задачка.
double в байты.

Вот так НЕ работает.
Код:
double val = 1.1;
QByteArray * Rez = new QByteArray();
QDataStream stream(Rez,QIODevice::ReadWrite);
stream << val;
std::cout << std::endl << Rez->size();// = 8 размер уже правильный

QByteArray testt(* Rez);
double test = *reinterpret_cast<double * const>(testt.mid(0,8).data());
std::cout << std::endl << test; //результат НЕ ПРАВИЛЬНЫЙ

И так тоже НЕ работает.

Код:
QByteArray testt(QByteArray::number(val));//Ключи f e g тож результата не дают
double test = *reinterpret_cast<double * const>(testt.mid(0,8).data());
std::cout << std::endl << test;

Каждый раз значения разные но не те что мне надо. (1.1);


Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Февраль 28, 2011, 02:56
Простая задачка.
double в байты.

double x;
char *px = (char*)&x;
не?


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Февраль 28, 2011, 03:20
Код:
не?
Оно самое.
Спасибо Fat-Zer !


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 04, 2011, 16:01
Такс.. продолжим
Пример
Код:
double vla;
char * px = 0;
px = (char*)&val;
QByteArray Rez(px);
return Rez.mid(0,8).data();
работает при условии что double будет к примеру
1.5165465
или
1.52
А вот если
1.5 или 1.50 а 1.0 тем более не пашет.
работает при условии когда после точки более 1 цифры и последняя не равняется 0;
конечно можно решить проблему топорным способом но хотелось бы правильно.

последнее что заметил преобразование с 1.5001 выдало не правильный результат.



Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Март 04, 2011, 16:11
в конструкторе надо размер указывать:
QByteArray Rez(px,8);
[added]
я соврал... нужно ручками заполнять массив... оба эти метода будут копировать всё до первого 0-го байта...


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 04, 2011, 16:31
в конструкторе надо размер указывать:
QByteArray Rez(px,8);
Опять СПАСИБО.

Все равно ничего не получается.
Народ кто может помогите.
Цель любое число double в 8 байт которые потом отправляют по сети.
На другом конце рассчитано что double будет иметь именно 8 байт
Код:
double val =  BitConverter::ToDouble(data, 36);

метод
QByteArray Rez(px);
иногда создает меньше байт что не приемлемо
метод
QByteArray Rez(px,8);
и предварительно
Rez.clear();
или Rez[0]= 0x0;
Результата не дает



Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Март 04, 2011, 21:46
Все равно ничего не получается.
Народ кто может помогите.
какие симптомы на этот раз?


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 04, 2011, 22:32
Код:
                val = 1.51;
char * xp = 0;
xp = (char*)&val;
QByteArray byte(xp,8);
std::cout << std::endl << "SIZE:" << byte.size();
double dbl1 = *reinterpret_cast<double * const>(byte.mid(0,8).data());
std::cout << std::endl << "VALUE:" <<  dbl1;
std::cout << std::endl << byte.mid(0,8).data();
return byte.data();

если значение val = 1.5 тогда бутесы не выводятся(2 строка снизу)
и соответственно не идут дальше.
а значение выводится 3 строка снизу
в какую сторону копать без понятия.


Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Март 04, 2011, 23:04
если значение val = 1.5 тогда бутесы не выводятся(2 строка снизу)
и соответственно не идут дальше.
а значение выводится 3 строка снизу
в какую сторону копать без понятия.

1) wtf бутесы?
2) само собой не выводятся... вы бы хотя бы в дебагере посмотрели, что в QByteArray содержится:
Цитировать
00 00 00 00 00 00 f8 3f
вывод видит первый 0 и считает, что это пустая строка. такое подойдёт только для передачи в бинарном виде...
так для чего вы это пользовать хотите?


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 04, 2011, 23:12
Цитировать
так для чего вы это пользовать хотите?
Формируется последовательный пакет байтов и отправляется по сети (серверу)
так серверу не приходит даже это
Код:
00 00 00 00 00 00 f8 3f
Проверил в дебагере.. одни сплошные 000000....


Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Март 04, 2011, 23:19
Формируется последовательный пакет байтов и отправляется по сети (серверу)
так серверу не приходит даже это
слабо разбираюсь в сетевых технологиях, но по логике проблема должна быть или в дальнейших преобразованиях данных, или на стороне сервера, или где-то в отправке.


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 04, 2011, 23:30
В пакете отправляемом содержаться масса разных значений и все доходит..
эта часть по середине и там 0000

вставляю данные так (как и все прочее)
datagram.insert(36,doubleTo8Byte(doblevalue));

doubleTo8Byte() - это и есть проблемная функция.(inline)

никакого ввода вывода не использую, datagram тоже QByteArray



Название: Re: double to 8 byte - QByteArray
Отправлено: Fat-Zer от Март 04, 2011, 23:58
datagram.insert(36,doubleTo8Byte(doblevalue));

мда... теже яица, что и с созданием были... insert копирует до 1-го \0. да и нафиг тут целая функция... всё же в одну строчку пишется!
datagram.insert(36, (char*)&doblevalue, sizeof(doblevalue)); // подразумевается, что doblevalue имеет тип double


Название: Re: double to 8 byte - QByteArray
Отправлено: max1983 от Март 05, 2011, 00:04
Проблема решена
надо было возвращать объект QByteArray а не набор байтов от QByteArray::data()
в отдельной функции сделал так как
Код:
char *px = (char*)&x;
возвращает больше байтов а мне надо было 8