|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.04.2014, 00:51 | #1 |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
Работа с файловыи потоком, поиск порченого байта
Привет всем. Пишу программку по редактированию определённого типа ресурсных файлов. Данный тип содержит изображения, записанные в единый файл последовательно. Моя задача, найти позиции начала, и конца картинки, и заменить имеющуюся картинку своей. Не знаю, можно ли вырезать середину из потока, я поступил следующим образом. Инициализировал новый поток, записал в него данные из исходного потока до начала заменяемого файла, далее записал сам файл, и в конец записал кусок исходного потока после заменяемого файла. Вот основной код подмены файла.
Код:
Последний раз редактировалось XE5; 02.04.2014 в 02:28. |
02.04.2014, 09:01 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Не видно по этому коду в чем проблема и есть ли она вообще. Код должен вполне корректно заменить участок длиной EndPosition-StartPosition на данные длиной BufStream.Size начиная с позиции StartPosition. Если EndPosition-StartPosition=BufStream.Size, то можно вполне обойтись копированием целиком AMemoryStream в EndStream и одним CopyFrom для замены нужного участка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 02.04.2014 в 09:04. |
02.04.2014, 22:30 | #3 |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
Равенство неверно. Этот промежуток занят ресурсом, который мне нужно заменить. Новый ресурс естественно не обязан совпадать размерами с заменяемым ресурсом. Плохо что нет ни каких мыслей о причинах ошибки. Лично я просидел над ней часов шесть, так и не смог её найти. Такое ощущение, что этот байт какой-то флаг. Куда копать, не понимаю. Привожу код процедуры, которая ищет позиции PNG картинок в ресурсе. Может код наведёт на какие-то мысли.
Код:
Последний раз редактировалось XE5; 02.04.2014 в 22:34. |
02.04.2014, 23:38 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
1. Вопрос - зачем стартовая позиция на 1 уменьшается и финишная на 7 увеличивается?
2. Текст 'PNG' и 'END' можно искать с помощью PosEx в StringStream.DataString. В StringStream скопировать тем же CopyFrom из AMemoryStream. Возможно быстрей, не проверял. Но прозрачней точно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
03.04.2014, 01:44 | #5 | |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
Цитата:
Попробую, но проблему это не решит. По позициям всё чётко. Меняется какой-то байт именно в точке слейки (меняется, а не пропадает! Size на выходе тот что нужен), и не понимаю, по какой причине. Сравнивал с исходными файлами аналогичной программы, всё то же самое. Только там файл вначале полностью разбирался на фрагменты, а потом заново собирался этой же методикой, а я пытаюсь внести изменение без полной пересборки. |
|
03.04.2014, 04:23 | #6 |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
Всё, нашёл ошибку. Точнее даже не ошибку, а недочёт. Эти два байта это контрольная сумма PNG. Поэтому только в одной точке файла и было несовпадение. Вопрос решён, тема закрыта.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
шифрование байта | Oleg1988 | Общие вопросы C/C++ | 7 | 31.08.2012 19:41 |
Работа с потоком | Yur@ | Общие вопросы Delphi | 3 | 02.06.2011 12:46 |
Работа с ListView и потоком данных | piksel111 | Общие вопросы Delphi | 4 | 18.04.2011 01:48 |
Чтение 0 байта | TorrMoZZZZ | Помощь студентам | 0 | 26.09.2010 21:44 |
Поиск первого байта ресурса. | Obsever0 | Общие вопросы Delphi | 2 | 04.06.2010 13:58 |