Russian Qt Forum
Июнь 17, 2024, 05:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: double to 8 byte - QByteArray  (Прочитано 8758 раз)
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);
Записан
Fat-Zer
Гость
« Ответ #1 : Февраль 28, 2011, 02:56 »

Простая задачка.
double в байты.

double x;
char *px = (char*)&x;
не?
Записан
max1983
Гость
« Ответ #2 : Февраль 28, 2011, 03:20 »

Код:
не?
Оно самое.
Спасибо Fat-Zer !
Записан
max1983
Гость
« Ответ #3 : Март 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 выдало не правильный результат.

« Последнее редактирование: Март 04, 2011, 16:06 от max1983 » Записан
Fat-Zer
Гость
« Ответ #4 : Март 04, 2011, 16:11 »

в конструкторе надо размер указывать:
QByteArray Rez(px,8);
[added]
я соврал... нужно ручками заполнять массив... оба эти метода будут копировать всё до первого 0-го байта...
« Последнее редактирование: Март 04, 2011, 16:26 от Fat-Zer » Записан
max1983
Гость
« Ответ #5 : Март 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;
Результата не дает

« Последнее редактирование: Март 04, 2011, 18:43 от max1983 » Записан
Fat-Zer
Гость
« Ответ #6 : Март 04, 2011, 21:46 »

Все равно ничего не получается.
Народ кто может помогите.
какие симптомы на этот раз?
Записан
max1983
Гость
« Ответ #7 : Март 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 строка снизу
в какую сторону копать без понятия.
« Последнее редактирование: Март 04, 2011, 22:51 от max1983 » Записан
Fat-Zer
Гость
« Ответ #8 : Март 04, 2011, 23:04 »

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

1) wtf бутесы?
2) само собой не выводятся... вы бы хотя бы в дебагере посмотрели, что в QByteArray содержится:
Цитировать
00 00 00 00 00 00 f8 3f
вывод видит первый 0 и считает, что это пустая строка. такое подойдёт только для передачи в бинарном виде...
так для чего вы это пользовать хотите?
Записан
max1983
Гость
« Ответ #9 : Март 04, 2011, 23:12 »

Цитировать
так для чего вы это пользовать хотите?
Формируется последовательный пакет байтов и отправляется по сети (серверу)
так серверу не приходит даже это
Код:
00 00 00 00 00 00 f8 3f
Проверил в дебагере.. одни сплошные 000000....
« Последнее редактирование: Март 04, 2011, 23:17 от max1983 » Записан
Fat-Zer
Гость
« Ответ #10 : Март 04, 2011, 23:19 »

Формируется последовательный пакет байтов и отправляется по сети (серверу)
так серверу не приходит даже это
слабо разбираюсь в сетевых технологиях, но по логике проблема должна быть или в дальнейших преобразованиях данных, или на стороне сервера, или где-то в отправке.
Записан
max1983
Гость
« Ответ #11 : Март 04, 2011, 23:30 »

В пакете отправляемом содержаться масса разных значений и все доходит..
эта часть по середине и там 0000

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

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

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

Записан
Fat-Zer
Гость
« Ответ #12 : Март 04, 2011, 23:58 »

datagram.insert(36,doubleTo8Byte(doblevalue));

мда... теже яица, что и с созданием были... insert копирует до 1-го \0. да и нафиг тут целая функция... всё же в одну строчку пишется!
datagram.insert(36, (char*)&doblevalue, sizeof(doblevalue)); // подразумевается, что doblevalue имеет тип double
Записан
max1983
Гость
« Ответ #13 : Март 05, 2011, 00:04 »

Проблема решена
надо было возвращать объект QByteArray а не набор байтов от QByteArray::data()
в отдельной функции сделал так как
Код:
char *px = (char*)&x;
возвращает больше байтов а мне надо было 8
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.