Определение сходства двоичных файлов - PullRequest
0 голосов
/ 11 июня 2018

Я пишу модульные тесты вокруг процесса HTML в PDF и имею набор образцов входных файлов HTML и набор PDF, представляющий ожидаемый результат.Я хотел бы сравнить их, чтобы определить, что процесс сгенерировал правильный вывод.

Очевидно, что в файлах PDF есть некоторые недетерминированные компоненты, поэтому я не могу выполнить прямое двоичное сравнение.Я не особо хочу разбирать вывод PDF, поэтому я подумал, что было бы неплохо просто проверить, насколько файлы различаются (и пройти тест, если они отличаются, скажем, менее чем на 1%).

Я не могу просто сосчитать различные байты в одном и том же месте массива, так как кажется, что могут быть небольшие различия в размерах, поэтому в каждом файле все будет немного смещено.

Так, вопрос в том, существует ли проверенный и проверенный алгоритм определения того, насколько отличается общее содержимое двух больших байтовых массивов?

Спасибо,

Стив.

Редактировать:

Прикрепить изображение, чтобы показать, что сгенерированные файлы в целом одинаковы ...

enter image description here

1 Ответ

0 голосов
/ 11 июня 2018

ОК, поэтому я нашел метод, который, кажется, работает довольно хорошо.Это не обязательно очень эффективно, но каждый тест все еще выполняется примерно за полсекунды, так что это хорошо для моей цели.Размещать его здесь на случай, если это поможет кому-то другому.

В основном он просто суммирует байты в каждом массиве и вычисляет разницу:

public static bool IsAnalogousTo(this byte[] left, byte[] right, int tolerance)
{
    long leftSum = 0;

    foreach (var b in left)
    {
        leftSum += b;
    }

    long rightSum = 0;

    foreach (var b in right)
    {
        rightSum += b;
    }

    return Math.Abs(leftSum - rightSum) < left.Length / tolerance;
}

Я думаю, что файлы имеют размер ~ 115kразмер - если сумма всех байтов в файлах такого размера меньше, чем ~ 15k, то это означает, что менее одного бита на каждые десять байтов (параметр допуска) отличается.

Это хорошо работает для того, что яхочу.Для других целей, где требуется большая точность, вероятно, было бы лучше сделать это порциями, чтобы убедиться, что области файла похожи.

Конечно, для небольшого набора данных это было бы бесполезно.Было бы сказано, что [10, 20, 30, 40] и [0, 0, 0, 100] одинаковы, но на 115 000 байтов разумно структурированных данных, таких как PDF, я думаю, что это, вероятно, приемлемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...