Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм сравнения файлов.   Найти похожие ветки 

 
DevilDevil ©   (2007-01-25 01:34) [0]

Вопрос: существует ли какой-нибудь быстрый способ сравнения файлов... точнее нахождения всех общих цепочек байт?

по моему естественно:
1) оба файла надо сначала занести в память
2)
function EqualBytes(P1, P2 : pointer; MaxLength : DWORD) : DWORD;
asm
 push esi
 push edi
 mov esi, eax
 mov edi, edx

 {} mov edx, ecx

 shr ecx, 2
 jz @normecx
 Repe cmpsd
 je @normecx
 mov ecx, 3
 sub esi, 4
 sub edi, 4
 jmp @cmpbytes
 @normecx:
   mov ecx, edx
   and ecx, 3
   jz @Exit
 @cmpbytes:
   Repe cmpsb
   je @exit
   dec esi

@Exit:
 sub eax, esi
 neg eax
 pop edi
 pop esi
end;


 
Германн ©   (2007-01-25 01:45) [1]


>
> DevilDevil ©   (25.01.07 01:34)
>
> Вопрос: существует ли какой-нибудь быстрый способ сравнения
> файлов... точнее нахождения всех общих цепочек байт?

Тут обязательно нужно ограничиться какими-то "осмысленными" критериями. нахождения всех общих цепочек байт слишком общо и практически не подлежит алгоритмизации.
Даже TotalCommander -> "Сравнить файлы по содержимому" от весьма уважаемого мною Christian Gisler не всегда работает так, как это мне нужно.


 
DevilDevil ©   (2007-01-25 10:19) [2]

up


 
Сергей М. ©   (2007-01-25 10:31) [3]


> 1) оба файла надо сначала занести в память


Хорошо когда эти файлы небольшие, а если не полезут ?

Решение тут напрашивается само собой - некэширующий файл-маппинг небольших фиксированных по размеру (кратному 64к) фрагментов обоих файлов.


 
DevilDevil ©   (2007-01-25 11:16) [4]


> Сергей М. ©   (25.01.07 10:31) [3]


В моём случае файлы не привысят 600кб.
Ну так есть какой-нибудь алгоритм?


 
Сергей М. ©   (2007-01-25 11:39) [5]


> DevilDevil ©   (25.01.07 11:16) [4]


А что в результате нужно получить ?
Список записей вида "смещение начала цепочки"+"длина цепочки" ?


 
Sinys ©   (2007-01-25 11:57) [6]

Что-то типа not(P1 and P2) не покатит? если больше нуля то баста


 
DevilDevil ©   (2007-01-25 12:41) [7]


> Сергей М. ©   (25.01.07 11:39) [5]


Смещение в первом файле, смещение во втором файле, длина цепочки


 
Сергей М. ©   (2007-01-25 12:48) [8]


> Смещение в первом файле, смещение во втором файле


Эдак ты далеко зайдешь.

Пусть есть два файла с одинаковым содержимым: ХХХ

Приведи результирующий список для данного примера, как ты себе его представляешь ...


 
novill ©   (2007-01-25 12:59) [9]

> [7] DevilDevil ©   (25.01.07 12:41)


а что вот стаким алогритм должен делать?

файл1 "1234 12345 1234"

файл2 "12345 1234 12345"


 
DevilDevil ©   (2007-01-25 13:06) [10]

для начала:

Смещение в первом файле, смещение во втором файле, длина цепочки

0, 0, 4
5, 6, 4
11, 11, 4

P.S. но в идеале:
0, 0, 4
5, 0, 5
11, 0, 4

дело в том, что я хочу уметь написать что то типа патчера + архиватора... для Delphi приложений (и уж тем более тематических приложений (БД, игры, ДВИЖКИ)) должно дать хорошую степень сжатия....... с учётом того, что программа-распаковщик знает, откуда брать исходный файл, чтобы получить результирующий ;)


 
Игорь Шевченко ©   (2007-01-25 13:15) [11]

Умные люди ищут в сети исходники программы diff (они есть) и вдумчиво их изучают. Там очень хороший алгоритм применен.


 
Сергей М. ©   (2007-01-25 13:20) [12]


> DevilDevil ©   (25.01.07 13:06) [10]


А куда у тебя делись , к примеру, записи:

0,0,1
0,6,1
0,11,1
..
?

Моль съела ?)
Они ведь точно так же удовлетворяют заданному тобой условию поиска ..


 
novill ©   (2007-01-25 13:21) [13]

а может сначала разберешь алгоритмы архивации?


 
DevilDevil ©   (2007-01-25 13:30) [14]

2Сергей М. ©   (25.01.07 13:20) [12]

а они должны отсеиваться


 
Сергей М. ©   (2007-01-25 13:40) [15]


> они должны отсеиваться


Чтой-то вдруг ?
Где это фигурирует в условиях задачи ?

В точном соответствии с твоими условиями записи 0,0,1  0,6,1  0,11,1 означают:
при поиске и сравнении цепочек длиной в один элемент обнаружено, что
в первом файле элемент "1" по смещению  0 встречается во втором файле по смещениям 0, 6, 11.

Что здесь противоречит условиям задачи ?


 
DevilDevil ©   (2007-01-25 16:23) [16]


> Сергей М. ©   (25.01.07 13:40) [15]


Вопрос: существует ли какой-нибудь быстрый способ сравнения файлов... точнее нахождения всех общих цепочек байт, максимальной длинны?

К этой формулировке придраться можно ещё больше. Вопрос тем не менее остаётся открытым; надеюсь, приведённый мной пример расставил все точки над "и", и Вы поняли мою задачу.

Кстати о diff, погуглил ничего вразумительного пока не нашёл (исходники всмысле), буду рад любой помощи, в том числе и предоставление ссылки на исходники diff.

P.S. меня интересует именно быстрый алгоритм. Метод полного перебора очень долгий, предположительно 15-60 минут для файлов в 400кб.

Доп вопрос:  как определить смещение в exe файле, с которого начинается код? Если учесть, что код выровнен по 4-х байтной границе (по крайней мере в Delphi), есть смысл проверять код по 4 байта за раз, начиная с этих точек. Такой подход может потерять до 3-х байт в каждой цепочке байт, зато увеличит скорость обработки на пару порядков.


 
Сергей М. ©   (2007-01-25 16:30) [17]


> Вопрос: существует ли какой-нибудь быстрый способ сравнения
> файлов


см. тот же diff.

Вполне эффективно сравнивает файлы и выводит протокол совпадений/несовпадений .

Только он, diff, не решает поставленную тобой задачу, ибо она и значально не корректна в своей постановке.


> как определить смещение в exe файле, с которого начинается
> код?


А никак.

Потому что сама постановка вопроса лишена смысла.
Гугли по "структура PE-модуля" - и да посетит тебе откровение.


 
Сергей М. ©   (2007-01-25 16:37) [18]


> способ сравнения файлов


> приведённый мной пример расставил все точки над "и"


Этот пример не имеет ни малейшего отношения к файлам.


 
Игорь Шевченко ©   (2007-01-25 16:52) [19]


> Кстати о diff, погуглил ничего вразумительного пока не нашёл
> (исходники всмысле), буду рад любой помощи, в том числе
> и предоставление ссылки на исходники diff.


Например:
http://www.codeproject.com/tools/difftool.asp
http://www.thefreecountry.com/programming/filecomparison.shtml


 
DevilDevil ©   (2007-01-25 17:09) [20]


> Игорь Шевченко ©   (25.01.07 16:52) [19]


спасибо, Diff я уже нашёл...
только exe он не сравнивает...


 
Игорь Шевченко ©   (2007-01-25 17:58) [21]

DevilDevil ©   (25.01.07 17:09) [20]


> спасибо, Diff я уже нашёл...
> только exe он не сравнивает...


То есть, слова про вдумчивое изучение алгоритма я очевидно в воздух говорил...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.049 c
15-1171898141
DillerXX
2007-02-19 18:15
2007.03.18
Казино рояль


15-1171614345
KSergey
2007-02-16 11:25
2007.03.18
Проверка перфоратора


15-1172411923
xayam
2007-02-25 16:58
2007.03.18
От Вас когда-нибудь уйдут все


3-1166470607
школьник :-)
2006-12-18 22:36
2007.03.18
Коннект к базе MS SQL


15-1172163533
default
2007-02-22 19:58
2007.03.18
Подключение по локальной сети в винде





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский