Числа в памяти
|
|
Sower | Дата: Воскресенье, 08 Ноября 2009, 11:55 | Сообщение # 1 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Возникла необходимость читать числа из памяти приложения, нашел нужные адреса с помощью ArtMoney, там одно значение 4байта, другое 2 байта, так вот 4 байта нормально читаются из памяти (нужное число), а вот то что 2 байта не то, которое должно быть в приложении. Каким образом 2-ух и 4-ех байтные числа отличаются и можно ли преобразовать
|
|
| |
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
|
|
| |
Alex3A | Дата: Воскресенье, 08 Ноября 2009, 16:39 | Сообщение # 6 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Grand) вобщем для преобразования надо было разделить на Торг сдесь не уместен Ничего делить отнимать и грабить тут не нужно Есть цифры в памяти, в двоичном формате, посмотреть можно и в шеснадцатеричном, память ну никак даже не догадывается что значат эти цифры, ей по фиг. Когда ты присваиваеш переменной значение, оно просто заносится в память отведенную для этой переменной и все, никаких вычислений и преобразований при этом не происходит. Зная адрес по которому находятся данные одной переменной их можно считать и дать другой переменной, при этом переменные должны быть однотипными, иначе получится что ты наливаеш в литровую емкость три литра жидкости и наоборот. Другими словами, все дело в интерпритации участка памяти, ибо там нет никаких переменных, символов и прочей гадости, только цифры. Ну и конечно, при работе с памятью есть определенные ограничения, попробуеш залезть не туда, тебе винда даст по рукам, в виде месаги.Добавлено (08 Ноябрь 2009, 16:39) --------------------------------------------- Да вот еще что, 32 битные числа могут быть, кроме с плавающей запятой, еще и формата даблворд, а в памяти это хранится наоборот, младшая часть, старшая часть. Разделив на 65536 ты просто сдвинул младшую часть, но это однозначно указывает на то что ты применяеш не тот тип переменной, и когда исходное число у тебя будет иметь не пустую часть в старшей, этот фокус не проканает. Если все же тебе понравится этот корявый метод, то и делить то ничего не надо, просто измени адрес на 2 в нужную сторону. А если хочеш поананировать, то считывай побайтно с последующим умножением, по известной формуле.
|
|
| |
toizy | Дата: Воскресенье, 08 Ноября 2009, 23:05 | Сообщение # 7 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (Grand) для преобразования надо было разделить Не делить надо, а юзать приведение типов )))
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |