Ну, а почему именно по 5 байт? Вероятно, там будет циклический поиск с постепенно увеличивающейся длиной. Если для выявления отличий байты сравниваются, то для выявления вставки/удаления фрагментов начиная с первого отличия ищутся совпадения (при этом длина для совпадающего фрагмента постепенно увеличивается). Это позволит выявить границы вставленных и удаленных фрагментов. Но опять же, некоторые случаи, типа, вставки нескольких байт и изменения нескольких последующих байт могут затруднять принятие решения.
Потренируйся, например, на сравнении файлов в TotalCommander - как он ведет себя с текстовыми и двоичными файлами. Например, при вставке в текстовый файл фрагмента и небольшого изменения последующего текста TotalCommander иногда показывает отличия с места вставки и до конца файла, не имея возможности определить конец добавленного фрагмента. Тогда на помощь приходит команда "установить маркер ручного сопоставления" - мы вручную указываем конец вставленного фрагмента, а дальнейшее сравнение покажет корректный результат.
Редактировалось 5 раз(а), последний 2021-10-13 17:09:20
Этот топик читают: Гость
Ответов: 4628
Рейтинг: 749
|
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Я думаю сравнивать нужно по одному байту.В строках это должно прокатить т.к. там смещение не важно.А вот в жестко кодированных строках уже засада там каждый лишний символ, даже пробел в основном приводит к краху программы.
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Udokanec писал(а): там каждый лишний символ |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Блин почему первый байт не читает
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Вероятно, данные из диалога выбора файла попадали на вход компонента For и сбивали начальное значение цикла. Надо следить за подаваемыми на компоненты данными. 1) Работать с файлом надо после того как этот файл успешно открыт - после события FileStream.onLoad, а не выбора файла в диалоге. 2) После чтения/записи любых данных из файла Position автоматически сдвигается вперед на "после прочитанных данных" - необязательно двигать её вручную (если только не надо установить в какую-то другую позицию). |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Спасибо разобрался
--- Добавлено в 2021-10-15 15:15:14 [b]Netspirit [/b] А как обойти такую байду.Мне при сравнивании строк в оригинальном файле нужен шаг 1 байт,а в переведенном 2 байта.Сравнение будет некорректным.
Редактировалось 4 раз(а), последний 2021-10-15 15:24:08 |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Раздели понятие "шаг" и понятие "длина считываемой последовательности". При сравнении длины считываемой последовательности должны быть одинаковыми (это свойство DataToFileEx.DataSize). Поскольку позиция считывания автоматически увеличивается на длину считываемых данных, то в том месте, где "шаг" не равен длине последовательности (или новая позиция не устраивает по другой причине), нужно добавить ручную установку позиции для следующего считывания.
|
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Я так понял что DataSize должно быть одинаковым у обоих файлов?А как мне тогда искать измененные файлы?Я думал например счетчик встал на позицию 10 в оригинальном файле сравнил количество байт с переведенным.А у них разный размер-значит это перевод.Занес в таблицу позицию,оригинальное слово,и переведенное.Добавил разницу байт в конец исходный слова и встал на эту позицию.И дальше до конца файла.Или так не получится?
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Udokanec писал(а): А как мне тогда искать измененные файлы?Простой способ - искать только измененные данные. Читаешь 1 байт из первого файла и 1 байт из второго, сравниваешь. Если не равны - сообщаешь позицию этого байта. Не подходит если требуется определить вставку или удаление данных. Сложный способ - определение вставок/удалений. Я не владею конкретным алгоритмом для этого и на словах это описывать сложно. Примем что файл 1 - это НОВЫЙ (ИЗМЕНЕННЫЙ) ФАЙЛ, файл 2 - ЭТАЛОННЫЙ ФАЙЛ 1) Находишь первый отличающийся байт в обеих файлах Новый: ABCxyzDEFGHIMNOPQRSTU 2) Проверяем вставка ли это в 1-м файле. Для этого читаем следующий байт в 1-м файле и сравниваем с найденным в п.1 байтом 2-го файла (отличающимся). Если не равны - берем третий байт из 1-го файла и опять сравниваем. Делаем так, пока байты не совпадутЭталон: ABCDEFGHIJKLMNOPQRSTU Новый: ABCxyzDEFGHIMNOPQRSTU Если нашли совпадающий байт дальше - между позицией первого отличающегося байта и позицией совпадающего байта в 1-м файле был вставлен фрагмент.Эталон: ABCDEFGHIJKLMNOPQRSTU 2) Проверяем удаление фрагмента в 1-м файле. Для этого тот же отличный байт в 1-м файле и ищем во 2-м начиная с позиции различного байта (в п.1). Если нашли дальше чем текущая позиция - между позицией первого отличающегося байта и позицией следующего совпадающего байта 2-го файла в 1-м файле был удален фрагмент. (Алгоритм тот же что и при вставке, только ищем "вставку" во 2-м файле). Новый: ABCGHIMNOPQRSTU 3) Если по результатам п.2-3 не было вставки-удаления - значит это просто 1 измененный байт в данной позицииЭталон: ABCDEFGHIJKLMNOPQRSTU Новый: ABCGHIMNOPQRSTU Эталон: ABCDEFGHIJKLMNOPQRSTU 4) В зависимости от предыдущих результатов подправляется позиция для следующего сравнения и повторяем из п.1. Вероятно это будет давать неопределенные результаты при наличии цепочек повторяющихся байт и изменениях в них. Udokanec писал(а): счетчик встал на позицию 10 в оригинальном файле сравнил количество байт с переведеннымUdokanec писал(а): А у них разный размер-значит это перевод.Редактировалось 20 раз(а), последний 2021-10-18 15:59:22 |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Я начал делать так.В файле программы-любой,В начале слова-в строках обычно стоит один или несколько пробелов.Я на этом решил сыграть.
--- Добавлено в 2021-10-18 14:14:34 Не правильно выразил мысль.Включаем перебор по байтово через for первый файл.Как только доходит до пробела счетчик останавливается.У нас целое слово в Hex.Переходим к перебору второго файла по байтово до пробела.останавливаем перебор.Сравниваем оба слова если есть разница в кол-ве байт Записываем позицию и слова в таблицу.Дописываем недостающие байты пробелами в первый файл и дальше перебор с новой позиции.Так нельзя? Редактировалось 1 раз(а), последний 2021-10-18 14:14:34 |
|||
карма: 0 |
|
25