Консультация № 16077
19.01.2005, 16:36
0.00 руб.
0 7 7
hi!
есть 2 файла. размер одинаков, дата роли не играет. бинарики.
надо определить, есть ли в них различия.
как это лучше сделать? можно побайтово сравнить (железный метод),
а ещё делают вроде так - суммируют все байты, а сумму сверяют.
так вот, стоит ли сверять побайтово?
а если делать через контрольную сумму, то насколько вероятна ошибка?
(если байты разные, а сумма одинаковая).
вот, часто приходится сверять такие файлы. хочу сделать прогу. как лучше сделать?

Обсуждение

Неизвестный
19.01.2005, 16:43
общий
это ответ
Здравствуйте, Вiктор!
comp , но только 10 различий
fc из unix tools/dos
самое лучшее - как в unix - MD5 Hash
mkmd5 из unix tools с sourceforge.net
всё сделали за тебя, осталось bat‘ник написать: for+errorlevel
Неизвестный
19.01.2005, 17:15
общий
это ответ
Здравствуйте, Вiктор!
Если существут хотя-бы мизерная вероятность совпадения CRC (а она разумеется существует и зависит от сложности формулы её расчета), то я бы этот метод использовать не стал.
И вообще никогда не слышал о том, чтобы при сравнении двух файлов использовали CRC.
давно
Советник
419
1011
19.01.2005, 17:24
общий
это ответ
Здравствуйте, Вiктор!
Есть такой метод. Называется CRC. Есть CRC32.
По сути, ошибка маловероятна. Там циклическое что-то..
Лучше, конечно, побайтово сравнивать. Ничего сложного в этом нет.
Удачи!
Неизвестный
19.01.2005, 18:02
общий
это ответ
ъДТБЧУФЧХКФЕ, чiЛФПТ!
1. чЕТПСФОПУФШ ЕУФШ Й ОЕ ПЮЕОШ НБМБ: ПОБ ТБЧОБ ПФОПЫЕОЙА ДМЙОЩ Ч ВБКФБИ РПМХЮЕООПК ЛПОФТПМШОПК УХННЩ Л ТБЪНЕТХ УБНПЗП ЖБКМБ.
Неизвестный
19.01.2005, 18:09
общий
это ответ
Здравствуйте, Вiктор!
Если тебе нужно 100% гарантия одинаковости файлов, то единственный вариант - делать побайтовое (пословное) сравнение.
А если есть утилита побайтового сравнения, то нафига что-то другое нужно.
Кстати, в DOS‘е (и в виндах) есть утилита fc, которая запросто умеет делать сравнение бинарных файлов (с ключом /B). Используй ее. Можешь командный файл написать.
В UNIX‘е есть утилита diff и еще какая-то.
Неизвестный
20.01.2005, 18:24
общий
это ответ
Здравствуйте, Вiктор!
Можно сделать через подсчёт контрольной суммы типа crc32 - это приблизительно около 70% даёт верности. Но если просто перебирать то во-первых меньше займет времени и будет 100% точность.........................
Неизвестный
21.01.2005, 02:56
общий
это ответ
Здравствуйте, Вiктор!
Вот алгоритм, используемый в PKZIP, ARJ, RAR

Приложение:
#include <limits.h>typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long UCRC;#define CRCPOLY 0xEDB88320L#define UPDATE_CRC(r,c) r=crctable[((uchar)(r)^(uchar)(c))&0xff]^(r>>CHAR_BIT)static UCRC crctable[UCHAR_MAX + 1];UCRC cdecl crc;void make_crctable(){ uint i, j; UCRC r; for (i = 0; i <= UCHAR_MAX; i++) { r = i; for (j = CHAR_BIT; j > 0; j--) { if (r & 1) r = (r >> 1) ^ CRCPOLY; else r >>= 1; } crctable[i] = r; }}void crc_buf( char *str, int len){ while (len--) UPDATE_CRC(crc, *str++);}main() { crc = CRC_MASK; // Инициализация crc_buf( buffer, size); // Вычисление CRC по данным буфера ...... crc_buf( buffer, size); // Обновляем CRC со следующей порцией данных printf("Значение CRC - %lx", crc ^ CRC_MASK);}
Форма ответа