![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
TheDestroyer |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Здравствуйте, необходимо искать в бинарном файле заданную последовательность байт и запоминать позицию (адрес) для последующей записи в найденное место.
Есть пример из MSDN:
Но fseek ставит указатель на заданный адрес, а мне надо найти последовательность байт. Неужели надо использовать fread() в цикле, чтобы пройти по всему файлу? Может есть специальная функция для этого?
Использовать getline() для поиска байтов тут вроде неправильно, т.к. она для текста. Подскажите пожалуйста как правильно найти последовательность байт в бинарном файле и запомнить адрес для последующей записи? |
||||
|
|||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
вы использете текстовый режим (он по умолчанию) открытия файла:
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
TheDestroyer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Спасибо за подсказку, но вопрос остается - как лучше искать заданную последовательность байт в бинарном файле чтобы запомнить адрес для последующей записи?
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
TheDestroyer, если файл размеров в единицы-десятки мегобайт, считай его в память, и ищи в памяти
|
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
TheDestroyer, Что именно нужно найти в файле? Опишите...
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
TheDestroyer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Описываю:
Есть exe фаилы. Необходимо найти в каждом заданную последовательность байт (метку), прочитать начиная с адреса этой метки заданное число байт и прочитав, записать на это место другие заданные байты. Пока никак не могу понять - как искать именно последовательность байт, может так:
Проблемы: 1. Как читать с условием, что еще не конец файла? (аргумент while()) 2. Поиск должен быть непростым поиском совпадения в считанном массиве, т.к. искомая комбинация байт может быть 0x01 0x02 0x03, а считываение может попасть только на часть этой последовательности, в итоге ничего найдено не будет. Наверняка есть стандартный способ для этой задачи. |
|||
|
||||
andrew_121 |
|
||||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Используй отображение в память. http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx << тут есть пример http://www.developing.ru/com/memory_mapped_files_01.html Добавлено через 2 минуты и 19 секунд Т.е. В это случае логичнее использовать отображение файла в память. И все операции становятся аналогичными работе с массивом. И изменять его тоже можно. Добавлено через 12 минут и 9 секунд вот еще пример: http://rghost.ru/366127 сюда выгружаться не хочет почему-то... -------------------- Удалил аккаунт. Прощайте! |
||||||
|
|||||||
vnsk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.7.2009 Репутация: нет Всего: нет |
Вариант на С:
P.S. Предполагается, что в файле нет нулевых символов. В противном случае необходимо написать собственную функцию - аналог strstr() - нахождения построки УЖЕ не в строке, а в массиве данных. Модератор: Не забываем пользоваться кнопочкой "Код" Это сообщение отредактировал(а) bsa - 27.7.2009, 10:59 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
После этой строки нужно добавить:
Судя по этому: искать нужно не строку. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
vnsk |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 22.7.2009 Репутация: нет Всего: нет |
> После этой строки нужно добавить:
> fseek(stream, 0L, SEEK_SET); Да. Обязательною > Судя по этому: > unsigned char Data[] = {0xe9, 0xf2, 0x01, 0x00, 0x00}; > искать нужно не строку. А что больше смущает? - Написание конретной требуемой функции или сенарий "что делать"? Вариант на "С":
Модератор: Не забываем пользоваться кнопочкой "Код" Это сообщение отредактировал(а) bsa - 27.7.2009, 11:00 |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
![]() vnsk, я вас прошу, во-первых, комментируйте с помощью тегов QUOTE, а не во-вторых, исходники оформляйте с помощью тега CODE *** strlen до нулевого символа считает. она не подходит здесь, т.к. элементы массива могут иметь любые значения.
размер массива определяется так:
Это сообщение отредактировал(а) zim22 - 26.7.2009, 18:07 |
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
vnsk, Пожалуй....Зим22 все сказал.
Это сообщение отредактировал(а) andrew_121 - 26.7.2009, 19:01 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
ЗапаснойЛеопольд |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 29.6.2009 Репутация: нет Всего: нет |
Это было бы справедливо если sizeof применять к массиву, а не к указателю на char, как у него. int DataInMem( char *data, char *mem, int n_max ) Надо бы вычислять длинну вне функции, и передавать её отдельным аргументом. Это сообщение отредактировал(а) ЗапаснойЛеопольд - 27.7.2009, 11:20 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "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. |