Форум
Написать нам
  • Страница 1 из 1
  • 1
Числа в памяти
SowerДата: Воскресенье, 08 Ноября 2009, 11:55 | Сообщение # 1
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
Возникла необходимость читать числа из памяти приложения, нашел нужные адреса с помощью ArtMoney, там одно значение 4байта, другое 2 байта, так вот 4 байта нормально читаются из памяти (нужное число), а вот то что 2 байта не то, которое должно быть в приложении. Каким образом 2-ух и 4-ех байтные числа отличаются и можно ли преобразовать help
 
RushДата: Воскресенье, 08 Ноября 2009, 12:12 | Сообщение # 2
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (Grand)
Каким образом 2-ух и 4-ех байтные числа отличаются и можно ли преобразовать

16-битное - тип integer, 32-битное - тип long. Преобразовать, надеюсь, знаешь как...

Добавлено (08 Ноябрь 2009, 12:12)
---------------------------------------------
Хотя, может они и по другому в делфи называются.
Важно, что 16 и 32-битное.

 
SowerДата: Воскресенье, 08 Ноября 2009, 13:35 | Сообщение # 3
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
Rush, спасибо, но например как из 262159 получить 15 :(
Я не знаю как преобразовать :( Получается, что 262159 - 16-битное,а что если я преобразую в 32-битное, то полуится 15? %)

Добавлено (08 Ноябрь 2009, 13:35)
---------------------------------------------
P.S. В данном случае 15 - это то,что ожидается, а 262159 - то, что получаю

Сообщение отредактировал Grand - Воскресенье, 08 Ноября 2009, 13:34
 
Alex3AДата: Воскресенье, 08 Ноября 2009, 14:20 | Сообщение # 4
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
double, float, 32битные цыфери число с плавающей запятой, например 1,5, или еще могут
быть показаны в експоненте. Формат числа состоит из мантисы и основания, как то встретился мне алгоритм перевода, че то считал, считал, получилось. Потом понял что занимался ананизмом, этот способ хорош только для того что бы в ручную на бамаге сделать перевод. Посмотреть его по людски просто - доублетостр. Теперь про переменные и память, есть разные типы чисел, которые имеют разные размеры, загружая переменные из памяти просто надо учитывать тип переменной. К примеру, есть типы byte и Shortint, оба 8 битовые byte 0..255 а Shortint -128..127, в зависимости от того в переменную какого типа ты поместиш содержимое памяти ты получиш разные цифры. Итого что бы получить "правильное" число ты должен использовать переменную нужного типа, а для изменения типа использовать соответствующее приведение.
 
SowerДата: Воскресенье, 08 Ноября 2009, 15:09 | Сообщение # 5
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
Вобщем я проанализировал данные, посчитал... вобщем для преобразования надо было разделить на 65536 :D
 
Alex3AДата: Воскресенье, 08 Ноября 2009, 16:39 | Сообщение # 6
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote (Grand)
вобщем для преобразования надо было разделить на

Торг сдесь не уместен :D
Ничего делить отнимать и грабить тут не нужно :D
Есть цифры в памяти, в двоичном формате, посмотреть можно и в шеснадцатеричном,
память ну никак даже не догадывается что значат эти цифры, ей по фиг.
Когда ты присваиваеш переменной значение, оно просто заносится в память отведенную
для этой переменной и все, никаких вычислений и преобразований при этом не происходит.
Зная адрес по которому находятся данные одной переменной их можно считать и дать другой переменной, при этом переменные должны быть однотипными, иначе получится что ты
наливаеш в литровую емкость три литра жидкости и наоборот. Другими словами, все дело в
интерпритации участка памяти, ибо там нет никаких переменных, символов и прочей гадости, только цифры. Ну и конечно, при работе с памятью есть определенные ограничения, попробуеш залезть не туда, тебе винда даст по рукам, в виде месаги.

Добавлено (08 Ноябрь 2009, 16:39)
---------------------------------------------
Да вот еще что, 32 битные числа могут быть, кроме с плавающей запятой, еще и формата
даблворд, а в памяти это хранится наоборот, младшая часть, старшая часть.
Разделив на 65536 ты просто сдвинул младшую часть, но это однозначно указывает на то что ты применяеш не тот тип переменной, и когда исходное число у тебя будет иметь
не пустую часть в старшей, этот фокус не проканает. Если все же тебе понравится этот
корявый метод, то и делить то ничего не надо, просто измени адрес на 2 в нужную сторону. А если хочеш поананировать, то считывай побайтно с последующим умножением, по известной формуле. :D

 
toizyДата: Воскресенье, 08 Ноября 2009, 23:05 | Сообщение # 7
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Quote (Grand)
для преобразования надо было разделить

Не делить надо, а юзать приведение типов )))


Жизнь оказалась не такой уж и забавной, как поначалу...
 
  • Страница 1 из 1
  • 1
Поиск: