Название: Base64 в long double Отправлено: bsf от Ноябрь 26, 2012, 16:14 Здравствуйте коллеги...
Есть значение uB6F61G4npAEQASSsG8nERHeBECDKkQA Это запись чисел из Delfi двух чисел типа Extended. Значение чисел 36.155 и 55.516667. Как прочитать это дело на Qt ? Делаю так: Код В чём моя ошибка? Спасибо за советы Название: Re: Base64 в long double Отправлено: mutineer от Ноябрь 26, 2012, 16:21 Код: ba.toLong(&ok,12); Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 26, 2012, 16:22 Пробовал и 10ку... - без разницы
Название: Re: Base64 в long double Отправлено: mutineer от Ноябрь 26, 2012, 16:23 Пробовал и 10ку... - без разницы Так а зачем 12 ставить, что это даст?а что у тебя находится в ba? Какой текст получился? Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 26, 2012, 16:49 Насчет 12 - поехали, описка скорее
Какой текст? Это же набор байтов и текст крякозябры! Название: Re: Base64 в long double Отправлено: mutineer от Ноябрь 26, 2012, 16:52 Код: QByteArray str("FF"); Если из Base64 ты получешь уже бинарное представление числа, то берешь себе data() указатель и кастуешь куда нужно Название: Re: Base64 в long double Отправлено: xokc от Ноябрь 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. Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 26, 2012, 18:57 О, спасибо xokc, это ближе к теме...а можно попросить пример записи и чтения в этот формат, а то я совсем запутался...
Название: Re: Base64 в long double Отправлено: mutineer от Ноябрь 26, 2012, 18:59 О, спасибо xokc, это ближе к теме...а можно попросить пример записи и чтения в этот формат, а то я совсем запутался... Примеры по указанной ссылке чем не нравятся? Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 26, 2012, 20:02 xokc, спасибо! Всё получилось и всё работает... И возвращает нужные данные!
Код
Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 27, 2012, 15:55 Ребят, имея заголовок функции:
Код не могу сообразить, как сделать обратно записать в base64 в тип Extended Пытаюсь записать так: Код Каким типом данным должен быть x? Чтобы я его запихнул в QByteArray? Название: Re: Base64 в long double Отправлено: Igors от Ноябрь 27, 2012, 16:01 Код
Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 27, 2012, 20:01 Спасибо, я уже сомневаться стал...но всё именно так, как у меня. Я вот случайно обнаружил, что исходная строка содержит 24 байта, первые два на Extended, остальные 4 не могу идентифицировать. Собственно в этом и проблема. Вопрос теперь другой, возможно ли ка нибудь идентифицировать эти 4 байта и преобразовать к какому нибудь типу? Известно только что это массив типа record с двумя переменными типа Extended... Ту длинную строку которую я приводил - это массив с одним элементом...
Название: Re: Base64 в long double Отправлено: xokc от Ноябрь 28, 2012, 09:18 Что-то ты тут сумбур развёл. Отвечаю ровно на те вопросы, которые ты задал.
Вопрос теперь другой, возможно ли ка нибудь идентифицировать эти 4 байта и преобразовать к какому нибудь типу? Можно. К любому типу данных размером в 4 байта. Например, к quint32. Или char[4]. Или short[2].Если нужно больше конкретики, конкретизируй вопрос. Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 28, 2012, 16:02 Мне тип данных неизвестен, поэтому я не знаю к чему делать cast. Методом тыка пробовал к int double - не выходит. Так что скорее всего это утопия. Надо смотреть как происходит сериализация. А этой возможности нет. Знаю точно, что это массив Дельфёвый структур. В структуре - 2 переменные типа Extended. Я их читаю, всё замечательно. А записать назад - не могу, не хватает этих преславутых 4 байтов.
Название: Re: Base64 в long double Отправлено: Igors от Ноябрь 28, 2012, 16:13 Мне тип данных неизвестен, поэтому я не знаю к чему делать cast. Методом тыка пробовал к int double - не выходит. Так что скорее всего это утопия. Надо смотреть как происходит сериализация. А этой возможности нет. Знаю точно, что это массив Дельфёвый структур. В структуре - 2 переменные типа Extended. Я их читаю, всё замечательно. А записать назад - не могу, не хватает этих преславутых 4 байтов. Забудьте Вы эти академические термины long/int double. На практике есть double (8 байт) и float (4 байтв), остальное - дань истории "сопроцессоров". Делаете такКод И смотрите какое значение разумное int или float [/offtop] "пресловутый" - от слова "слово", а не "слава" :) Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 28, 2012, 20:38 Я извиняюсь, но QByteArray нет метода read()
Название: Re: Base64 в long double Отправлено: Igors от Ноябрь 28, 2012, 21:04 Я извиняюсь, но QByteArray нет метода read() Ну не все же дается под copy/paste :) Из Ваших слов следует что есть блок данных 24 байта - ну и считайте его в эту структуру доступными средствами. Откуда-то де Вы данные беретеНазвание: Re: Base64 в long double Отправлено: xokc от Ноябрь 28, 2012, 21:32 Мне тип данных неизвестен, поэтому я не знаю к чему делать cast. Методом тыка пробовал к int double - не выходит. Так что скорее всего это утопия. Надо смотреть как происходит сериализация. А этой возможности нет. Знаю точно, что это массив Дельфёвый структур. В структуре - 2 переменные типа Extended. Я их читаю, всё замечательно. А записать назад - не могу, не хватает этих преславутых 4 байтов. Я правильно понимаю, что нужно реализовать какой-то обмен данными с Дельфи приложением и теперь читать из дельфового буфера получается, а обратно записывать - нет? Если - да, то для начала я бы оставил ровно те значения, которые которые там в этих 4 байтах и лежат. Если не прокатит - пробовать методом тыка - накапливать статистику и пытаться угадать, что именно там лежит. Дело в том, что того, что называется "массивом" в Delphi есть великое множество - начиная с банального array of и заканчивая TDynArray и т.п. Что именно применяется в данном конкретном случае и как оно сериализовалось - это вообще неочевидно. Кроме того, поскольку речь идёт массиве структур - то, с учётом неизвестного выравнивания этих структур, вообще можно мозг сломать.P.S. Последние 4 байта из исходной последовательности дают 0x00442A83 или 4467331. Ничего разумного я в этом значении не нахожу - информации мало. Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 28, 2012, 21:35 Есть программа, писанная на Дельфях, я думаю вы все её знаете - SASPlanet. Она сохраняет метки в формате XML. В одном из параметров координата(ы) меток сериализуется в Base64. Благодаря добрым людям я научился читать координаты, а вот писать не получается эти координаты не получается. Полагаю, что эти 4 байта - это что то такое, что без них программа отказывается эту метку поднимать...
Вот что сделано, пусть и через *опу. Файл main.cpp Код Результат естественно иной, во-первых, что то теряется при переводе типов, во-вторых, эти 4 байта, что в них? Загадка... Явный cast ни к чему не привёл... Название: Re: Base64 в long double Отправлено: V1KT0P от Ноябрь 28, 2012, 22:43 Результат естественно иной, во-первых, что то теряется при переводе типов, во-вторых, эти 4 байта, что в них? Загадка... Явный cast ни к чему не привёл... По идеи если есть три числа являющиеся координатами, и первые два это широта и долгота. То по идеи третье должно быть высота( скорее всего в метрах но может и в сантиметрах ).А для того чтоб не терялось советую использовать long double. добавлено: Вот быстренько набросал две функции конвертации: Код Вот вывод: Цитировать Longitude: 36.155 Как видно если правильно использовать С++ то получается компактно, правильно и красиво. А не та каша кода что у тебя =).Latitude: 55.5167 Altitude: 4467331 Generate Base64: "uB6F61G4npAEQASSsG8nERHeBECDKkQA" Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 29, 2012, 09:11 Спасибо, буду пробовать! Много нового для себя открыл! Я новичок в этой области и учусь! А что касается высоты - то странная она какая - то! Да и СасПланета вряд-ли ее умеет определять. Это что то иное. Буду пробовать...
Название: Re: Base64 в long double Отправлено: xokc от Ноябрь 29, 2012, 10:58 По идеи если есть три числа являющиеся координатами, и первые два это широта и долгота. То по идеи третье должно быть высота( скорее всего в метрах но может и в сантиметрах ). Как-то лихо Вы привязки делаете. Если так уж пальцем в небо тыкать, то я бы не int рассматривал, а float в качестве высоты. Вообще, автор СасПланета вроде адекватен вполне. Может прямо у него и спросить?Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 29, 2012, 11:18 Как-то лихо Вы привязки делаете. Если так уж пальцем в небо тыкать, то я бы не int рассматривал, а float в качестве высоты. Вообще, автор СасПланета вроде адекватен вполне. Может прямо у него и спросить? Спрашивали люди неоднократно, а получены уклончивые ответы, с типом Extended, ну и на том спасибо!Название: Re: Base64 в long double Отправлено: bsf от Ноябрь 29, 2012, 12:59 Потестил, всё отлично экспортируется и импортируется SAS-ом. V1KT0P спасибо за помощь, то что нужно!
|