Russian Qt Forum
Ноябрь 25, 2024, 18:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование QString в QByteArray.  (Прочитано 8499 раз)
Pavel74
Гость
« : Март 04, 2015, 10:18 »

Всем привет!!!
Возникла следующая задача, связанная с преобразованием данных. Итак, есть переменная в формате "qint32", в которую записывается значение принятое от некоторой железяки, в самой железяке этот параметр находится в формате IEEE 754. Далее, значение преобразуется в строку. Соственно код с комментариями.

Код:
//Обьявление переменных.
qint32      ReadRealValue;
QString    HexFloat;

Код:
Функция связи с "вундер-ваффен", и запись в переменную "ReadRealValue",  работает отлично, проблем нет. 

Код:
//Преобразование.
ReadRealValue = qToBigEndian<qint32>(ReadRealValue);  //Замена порядка байтов.
HexFloat.setNum(ReadRealValue, 16);  //Преобразование в строку.
 

Здесь все отлично, Qt - дебагер показывает строку "43F14000", которая полностью соответствует содержимому в памяти железяки. Далее, есть функция которая преобразует данные из QByteArray в строку содержащую число в формате IEEE 754. Я не являюсь ее автором, я нашел ее в интернете, и немного переделал под свои цели. Если кому интересно, вот функция:

Код:
//Convert Byte array to IEEE 754 Floating point data.
QByteArray.FloatArray = QByteArray::number(FloatArray.toLongLong(&ok,16),2);
   if(FloatArray.length()==32) {
          if(FloatArray.at(0)=='1')  sign =-1;
                    FloatArray.remove(0,1);
            }

            QByteArray fraction = FloatArray.right(23);

            for(int i=0; i<fraction.length(); i++)
                if(fraction.at(i)=='1')     mantissa += 1.0/(pow(2,i+1));

            int exponent = FloatArray.left(FloatArray.length()-23).toLongLong(&ok,2)-127;

            OutFloat = QString::number(sign*pow(2,exponent)*(mantissa+1.0),'f', 2 );
 

Данную функцию я тестировал, работает нормально. Т.е если я обьявляю, к примеру:
Код:
QByteArray   FloatArray("43F14000");

То в QLabel она выдает 482,5 что соответствует действительности. Это было отступление от темы.

Теперь мне нужно преобразовать строку HexFloat в QByteArray, для этого я использую следующую функцию:
Код:
QByteArray.FloatArray = QByteArray::fromHex(HexFloat.toLocal8Bit().constData());

И результат нулевой, при этом проект компилируется без ошибок и предупреждений. И у меня возникает вопрос.
Скажите пожалуйста, возможно я упустил какие либо дополнительные параметры при конвертировании?
Или возможны какие либо другие способы преобразования QString в  QByteArray?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Март 04, 2015, 11:21 »

А зачем вы используете .constData()?
Записан
Pavel74
Гость
« Ответ #2 : Март 04, 2015, 11:31 »

Согласен, это я поторопился. Я убрал этот параметр. Теперь вот так:
Код:
QByteArray.FloatArray = QByteArray::fromHex(HexFloat.toLocal8Bit());

Т.е задача преобразовать строку QString = "43F14000", в QByteArray = 43 F1 40 00.
 
Записан
Pavel74
Гость
« Ответ #3 : Март 04, 2015, 11:51 »

К сожалению это не помогает, любые аргументы форматирования (toLatin1, toAscii) выдают в дебагере "кракозябры".
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 04, 2015, 12:01 »

Код
C++ (Qt)
for( int i = 0; i < HexFloat.length(); i += 2 )
   FloatArray.append( HexFloat.mid( i, 2 ).toInt( nullptr, 16 ) );
Записан

Qt 5.11/4.8.7 (X11/Win)
Pavel74
Гость
« Ответ #5 : Март 04, 2015, 12:30 »

Код
C++ (Qt)
for( int i = 0; i < HexFloat.length(); i += 2 )
   FloatArray.append( HexFloat.mid( i, 2 ).toInt( nullptr, 16 ) );

Спасибо большое за помошь. Но к сожалению не помогло.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Март 04, 2015, 12:39 »

Как насчёт
Код
C++ (Qt)
QByteArray arr (reinterpret_cast<char*>(&ReadRealValue), sizeof(ReadRealValue);
?
Записан
Pavel74
Гость
« Ответ #7 : Март 04, 2015, 12:58 »

Спасибо, но к сожалению тоже не помогло.

В данном случае результат преобразования такой: BFA2661C.

В предыдущем варианте соответственно: BF868FAC.

В идеале должно быть: 43F14000.
Записан
Bepec
Гость
« Ответ #8 : Март 04, 2015, 13:18 »

Ребят вы что?

QByteArray QByteArray::​fromHex(const QByteArray & hexEncoded)

Туда не нужно передавать constData. Туда нужно передать именно toLocal8Bit.

Код:
    QString floatArray("43F14000");
    QByteArray as = QByteArray::fromHex(floatArray.toLocal8Bit());
    qDebug()<< as.toHex();
Цитировать
Отладка запущена
"43f14000"

PS это то, чего вы хотели?

PPS прочитал тему, но так и не нашёл строку HexFloat. Додумался, что это "43F14000". Если я не прав, поправьте и впредь выражайте свои хотелки более прямозначно, без отступлений Улыбающийся
« Последнее редактирование: Март 04, 2015, 13:20 от Bepec » Записан
Pavel74
Гость
« Ответ #9 : Март 04, 2015, 15:04 »

Огромное спасибо, разобрался. В следующий раз буду точнее формулировать свои вопросы. Еще раз спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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