![]() |
|
Модераторы: bsa |
![]()
|
|
| Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
bems, ок, спасибо за подсказки, попробую разобраться.
|
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Поиск подстроки там вроде бы адекватный. Ну, хорошо, вот встроил прямо в ваш код простенький поиск последовательности байт, думаю разберетесь.
Сначала ищем первый символ, если нашли то сраниваем оставшиеся байты. |
||||
|
|||||
| Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
volatile, странно, но код почему-то не работает. Хотя я тут написал свой, но он выглядит "древне" как-то, зато работает.
Попробую разобраться в чём тут неполадка, хотя я мало чего понимаю в этих преобразованиях и ссылках. Я даже не понял что значит "++p;". Тут либо увеличение байта на 1, либо что-то другое. Я вот тут подумал. Кажется не работает из за этой проверки:
Лично эта проверка не давала работать программе и ничего не находилось. Это сообщение отредактировал(а) Jr13san - 10.9.2011, 08:17 |
|||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
конечно, там "!" надо убрать.
я просто это у вас переписал, не глядя, надо так:
|
||||||
|
|||||||
| Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
В общем попробовал сделать первый тест на обмен данных:
http://www.youtube.com/watch?v=55mzCb0q09Y Там отлавливаются нажатия клавиш(на обычной клавиатуре цифры от 4 до 9). Вот, и выводится информация уже через Готическую функцию Print("Текст"); Где "Текст" - это значение по адресу в памяти Готики 2. Очень интересная вещь - эта программа, расширяет возможности... Я сейчас думаю над хорошим поиском строки байт, постараюсь разобраться в коде, что выше, но тяжеловато будет из за того, что я не понимаю некоторых вещей.
В остальном сам разберусь, я надеюсь. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Просто вводим указатель, на тот же массив. lpData - будет всегда указывать на начало массива, а p будет пробегать этот-же массив. например часто используемое в функции выражение: (p - lpData) - это расстояние от начала массива, до текущей позиции да. |
|||
|
||||
| Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Решил опять разбираться в математических действиях и никак не пойму что происходит в памяти...
То, что выделено жирным шрифтом я просто не понимаю как рассчитывается. весь код выше, я возьму лишь самую главную строчку: p = (BYTE*)memchr(p, signature [0], mbi.RegionSize - len_signature + 1 - (p - lpData) Как это математически рассчитывается я так и не понял. Из адреса адрес вычитается или как? Если кто разбирается в этом, помогите пожалуйста. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
Да.
UPD. Ну это в случае с BYTE* адреса вычитаются, потому что BYTE занимает один байт. А если в общем, то там возвращается количество sizeof(T) между двумя указателями, где T это тип на который они указывают Это сообщение отредактировал(а) bems - 15.9.2011, 21:20 -------------------- Обижено школьников: 8 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
я же писал выше:
Так как это указатели на BYTE, то это расстояние в байтах. p = (BYTE*)memchr(p, signature [0], mbi.RegionSize - len_signature + 1 - (p - lpData) Искать во всем регионе (mbi.RegionSize - len_signature + 1), за вычетом участка который уже прошли (p - lpData). |
|||
|
||||
| Jr13san |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Это то понятно, но если превратить p и lpData в десятичные числа, то не понятно откуда эти цифры вырисовываются.
Я не понимаю на что указывает p и lpData. У меня просто в голове не укладывается опять. Вот пример:
В данном куске кода показано что из себя представляют переменные ptr и lpData. А вот от куда такие десятичные числа взялись я так и не понял. И вот эта строчка:
По идее в ptr должен записать указатель на первый встречаемый символ 'r' от функции memchr, а на самом деле если вывести ptr на экран, то там не адрес, а целая строка, которая начинается с указателя на этот символ. Как понять такие действия? Если кто знает, помогите понять пожалуйста. |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Там именно адрес, просто дело в том что когда вы выводите указатель в cout, он выводит не сам указатель, а строку на который он указывает. (и еще, никогда не нужно совмещать в одной функции вывод в cout и printf()) printf("%p\n", ptr); // вывести указатель (в шестнадц. виде) printf("%s\n", ptr); // вывести строку на которую он указывает последнее это и есть аналог cout << ptr Это сообщение отредактировал(а) volatile - 16.9.2011, 09:03 |
|||
|
||||
| Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
В итоге получается, что я из одного указателя вычитаю другой и получаю разность. Эта разность и есть расстояние между байтами указателей.
Уфф... Но как связаны эти указатели в памяти? Хотя в принципе т.к. там массив один, значит и указатели работают в нём. А разность указателей даёт нам положение первого встречного символа. Но почему разность указателей возвращает число, а не указатель? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: нет Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| volatile |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Jr13san, вы чего-то не понимаете, я не могу понять чего. Там на самом деле, все просто.
После этого p будет содержать 4300000, так как lpData == 4300000
После этого p будет содержать 4300012, так как символ 'r' содержится именно по адресу 4300012
После этого I будет содержать (4300012-4300000), то есть 12, то есть расстояние от начала массива, до текущего символа. |
||||||||||
|
|||||||||||
| Jr13san |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
volatile, Спасибо, вот теперь понятно.
Правда я пробовал смотреть на десятичное представление адресов и там нумерация происходит не через 1, а через 8, т.е. так: 4300000 4300008 4300016 4300024 ... Ещё наверное последний вопрос: Зачем используют символ "*" в коде? & - это ссылка на адрес. * - это ссылка на объект? И какая разница в том, чтобы поставить так:
или так:
Т.е. сколько ролей играет эта звёздочка? |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |