Перейти к содержимому

(499) 940-40-00 подключение
(499) 940-00-00 служба поддержки

Програмисты помогите.


Сообщений в теме: 13

#1 iKest

    КатярА


  • Пользователи
  • 760 сообщений
2
Offline

Отправлено 19 апреля 2006 - 21:25

Народ, помогите перевести данные из HEX к нормальному виду.
Тип скорее всего real (координаты), а может и нет. Размер три байта.
Вобщем смысл в том, что есть файл, я его открываю в HEX редакторе. И мне оттуда надо выудить данные в норм виде.
Структура файла примерно такая

Цитата

14 00 D6 F6 A7 45 9B D6 8A 44 08 00 2E 42 00 00 C8 41 00 00 00 00 00 00 70 43 00 00 80 3F
1-2 Byte: Serial Number (00 00 means Object01, 01 00 Objet02 etc.)
3-6: X-Position
7-10: Y Position
11-14: Z Positon
15-26: Turning the Object
29,30: Size (U can make Objects bigger or smaller; normal size is 80 3F)

la cocaína no es buena para su salud,
la cocaína is not good for you... ©


#2 Lёlik


  • Гости
Offline

Отправлено 19 апреля 2006 - 22:16

введи в калькулятор в режиме HEX
1) 00 14
потом жми DEC, будет 20!

2) F6 D6 45 A7
3) D6 9B 44 8A
...
и так далее! Только байты не забывай менять местами.

#3 iKest

    КатярА


  • Пользователи
  • 760 сообщений
2
Offline

Отправлено 19 апреля 2006 - 22:32

Просмотр сообщенияLёlik (Apr 19 2006, 11:16 PM) писал:

введи в калькулятор в режиме HEX
1) 00 14
потом жми DEC, будет 20!

2) F6 D6 45 A7
3) D6 9B 44 8A
...
и так далее! Только байты не забывай менять местами.
Это первое, что я сделал, правда без перестановки байтов.
2) F6 D6 45 A7 = 4141237671
3) D6 9B 44 8A = 3600499850
Что-то на координаты не очень тянет.

Всё таки мне кажется разные типы данных по разному представляютя, а не в лоб. Наверно должны получиться числа типа 132.00012, -23.34554 (мантиса там, знаки разные)

la cocaína no es buena para su salud,
la cocaína is not good for you... ©


#4 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 00:14

Какая архитектура/адресация?
Впрочем, если архитектура 32 битная x86, то получается, что,
експонента слишком большая. То есть координаты как-то не вырисовываются...
Да и вообще - смущают твои три байта. Чего-то я такого не упомню, чтобы где-нибудь числа по три байта представлялись...
Вещественный формат для трехбайтовых чисел по моему не определён.

#5 iKest

    КатярА


  • Пользователи
  • 760 сообщений
2
Offline

Отправлено 20 апреля 2006 - 01:24

Видно-же, что ошибся я - не 3, а 4-е байта.

la cocaína no es buena para su salud,
la cocaína is not good for you... ©


#6 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 10:50

Ну, если эти данные лежат там, как должны (то есть ничего не надо вертеть), то экпоненета слишком большая. Если у тебя координаты должны быть, то экспоненты вряд ли может быть больше 3.
А по числам даже на вскидку видно, что экпонента всяко больше 10.
Ты вообще уверен в том, что правильно трактуешь эти данные?

#7 iKest

    КатярА


  • Пользователи
  • 760 сообщений
2
Offline

Отправлено 20 апреля 2006 - 11:55

Ну что мудрить-то. Прийдётся наверно самому скачать где нибудь Delphi или другой язык.
Есть же фунции разных представлений чисел. Объявляешь переменную нужного типа (real в Delphi например или в C++ float и double).
Присваиваешь ей шеснадцатиричное значение, а потом выводишь в десятичной форме.
Ещё лучше будет, если кто-нибудь приведёт мне пример такой программы.

Сообщение отредактировал iKest: 20 апреля 2006 - 11:58

la cocaína no es buena para su salud,
la cocaína is not good for you... ©


#8 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 16:36

:)
iKest, причём тут программа то?
Вот тебе формат float (32 разряда):
31........30..........................25......24..........................0
------------------------------------------------------
| <s>|<-------exp------->|<----mantissa--->|
------------------------------------------------------

Если ты возьмёшь хотя бы D69B448A, то в бинарном выражении это равняется
1101 0110 1001 1011 0100 0100 1000 1010
Значит знак - 1 (минус) .
Экспонента - 43
Мантисса - 0.10175626
То есть у тебя получается число -1.0175626 * 10^42. И это явно не координата.
В принципе, возможно, данное число надо вертеть (в определённых ВК такие вещи нужно делать, если данные получены с шины с другой адресацией). Но даже в этом случае (если вертеть, и по два, и по 4 байта) по-моему ничего здорового не получается. Даже на вскидку экспоненты слишком большие.

#9 Lёlik


  • Гости
Offline

Отправлено 20 апреля 2006 - 18:23

А если байты не поворачивать, то вродебы что-то более менее
D6 F6 A7 45: 3199.427246
9B D6 8A 44: 1110.706421

#10 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 19:01

А с чего их вообще надо крутить?
Кстати, а как это ты посчитал D6F6A745 равным 3199.427246?
Там та же фигня. Число отрицательное, экпонента - всё те же 43, мантисса - 0.16164677.
То есть практически всё тоже заоблачное число.

#11 Lёlik


  • Гости
Offline

Отправлено 20 апреля 2006 - 19:28

Просмотр сообщенияsighted (Apr 20 2006, 07:01 PM) писал:

А с чего их вообще надо крутить?
Кстати, а как это ты посчитал D6F6A745 равным 3199.427246?
Там та же фигня. Число отрицательное, экпонента - всё те же 43, мантисса - 0.16164677.
То есть практически всё тоже заоблачное число.
http://www.psc.edu/g.../ieee/ieee.html

#12 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 20:40

Спасибо. :))) Ты бы алгоритм чудесный свой написал, а не ссылку на стандарт. Хотя он как раз в тему.
Но как бы там ни было, экпонента для D6F6A745 равна 46.
С такой экпонентой при всё желании не получить 3 тысячи с чем-то.

#13 Lёlik


  • Гости
Offline

Отправлено 20 апреля 2006 - 21:23

Походу я какую-то буковку пропустил...

int main (void)
{
const unsigned long c1 = 0xF6D645A7;
const unsigned long c = 0xd6f64745;
const int p1 = ((c & 0x7f800000) >> 23) - 127;
const int p2 = (c & 0x7fffff);

printf ("(%d**2).%d\n", p1, p2);

return (0);
}

#14 sighted


  • Гости
Offline

Отправлено 20 апреля 2006 - 22:56

:))) Понятно.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных