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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Base64 в long double  (Прочитано 11513 раз)
bsf
Гость
« : Ноябрь 26, 2012, 16:14 »

Здравствуйте коллеги...
Есть значение uB6F61G4npAEQASSsG8nERHeBECDKkQA Это запись чисел из Delfi двух чисел типа Extended. Значение чисел 36.155 и 55.516667. Как прочитать это дело на Qt ?
Делаю так:
Код
C++ (Qt)
QByteArray arr = QByteArray::fromBase64("uB6F61G4npAEQASSsG8nERHeBECDKkQA");
QByteArray ba = arr.mid(0,12);
bool ok;
long double ld = ba.toLong(&ok,12);
// ok = false
 
В чём моя ошибка?
Спасибо за советы
Записан
mutineer
Гость
« Ответ #1 : Ноябрь 26, 2012, 16:21 »

Код:
ba.toLong(&ok,12);
У тебя числа в 12-ричной системе счисления, чтоли?
Записан
bsf
Гость
« Ответ #2 : Ноябрь 26, 2012, 16:22 »

Пробовал и 10ку... - без разницы
Записан
mutineer
Гость
« Ответ #3 : Ноябрь 26, 2012, 16:23 »

Пробовал и 10ку... - без разницы
Так а зачем 12 ставить, что это даст?

а что у тебя находится в ba? Какой текст получился?
Записан
bsf
Гость
« Ответ #4 : Ноябрь 26, 2012, 16:49 »

Насчет 12 - поехали, описка скорее
Какой текст? Это же набор байтов и текст крякозябры!
Записан
mutineer
Гость
« Ответ #5 : Ноябрь 26, 2012, 16:52 »

Код:
QByteArray str("FF");
 bool ok;
 long hex = str.toLong(&ok, 16);   // hex == 255, ok == true
Данный пример наводит на мысли что toLong хочет на входе именно текстовое представление числа, а не кракозябры

Если из Base64 ты получешь уже бинарное представление числа, то берешь себе data() указатель и кастуешь куда нужно
« Последнее редактирование: Ноябрь 26, 2012, 16:58 от mutineer » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Ноябрь 26, 2012, 17:13 »

Если из Base64 ты получешь уже бинарное представление числа, то берешь себе data() указатель и кастуешь куда нужно
К сожалению, тут не всё так просто. В Delphi Extended для Win32 - это 10 байтный тип данных, для которого прямого аналога в C++ нет. Для Win64 (как ни странно) - это 8 байтный long double.
Так что способ double *ptr = (double *)ba.data() прокатит только для Win64. Для Win32 нужно конвертировать ручками.
Подробнее можно почитать тут - http://www.linux.org.ru/forum/development/5990825.
Записан
bsf
Гость
« Ответ #7 : Ноябрь 26, 2012, 18:57 »

О, спасибо xokc, это ближе к теме...а можно попросить пример записи и чтения в этот формат, а то я совсем запутался...
Записан
mutineer
Гость
« Ответ #8 : Ноябрь 26, 2012, 18:59 »

О, спасибо xokc, это ближе к теме...а можно попросить пример записи и чтения в этот формат, а то я совсем запутался...

Примеры по указанной ссылке чем не нравятся?
Записан
bsf
Гость
« Ответ #9 : Ноябрь 26, 2012, 20:02 »

xokc, спасибо! Всё получилось и всё работает... И возвращает нужные данные!
Код
C++ (Qt)
long double *ptr;
fp80le_to_fp64(ptr, ba.data());
 
Записан
bsf
Гость
« Ответ #10 : Ноябрь 27, 2012, 15:55 »

Ребят, имея заголовок функции:
Код
C++ (Qt)
void fp64_to_fp80le(void *f80, const void *f64)
не могу сообразить, как сделать обратно записать в base64 в тип Extended
Пытаюсь записать так:
Код
C++ (Qt)
double *ld;
...
fp64_to_fp80le(x, ld);
Каким типом данным должен быть x? Чтобы я его запихнул в QByteArray?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 27, 2012, 16:01 »

Код
C++ (Qt)
char rebyat[10];
 
Записан
bsf
Гость
« Ответ #12 : Ноябрь 27, 2012, 20:01 »

Спасибо, я уже сомневаться стал...но всё именно так, как у меня. Я вот случайно обнаружил, что исходная строка содержит 24 байта, первые два на Extended, остальные 4 не могу идентифицировать. Собственно в этом и проблема. Вопрос теперь другой, возможно ли ка нибудь идентифицировать эти 4 байта и преобразовать к какому нибудь типу? Известно только что это массив типа record с двумя переменными типа Extended... Ту длинную строку которую я приводил - это массив с одним элементом...
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #13 : Ноябрь 28, 2012, 09:18 »

Что-то ты тут сумбур развёл. Отвечаю ровно на те вопросы, которые ты задал.
Вопрос теперь другой, возможно ли ка нибудь идентифицировать эти 4 байта и преобразовать к какому нибудь типу?
Можно. К любому типу данных размером в 4 байта. Например, к quint32. Или char[4]. Или short[2].
Если нужно больше конкретики, конкретизируй вопрос.
Записан
bsf
Гость
« Ответ #14 : Ноябрь 28, 2012, 16:02 »

Мне тип данных неизвестен, поэтому я не знаю к чему делать cast. Методом тыка пробовал к int double - не выходит. Так что скорее всего это утопия. Надо смотреть как происходит сериализация. А этой возможности нет. Знаю точно, что это массив Дельфёвый структур. В структуре - 2 переменные типа Extended. Я их читаю, всё замечательно. А записать назад - не могу, не хватает этих преславутых 4 байтов.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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