Какая информация изображает количественную разницу между двумя большими данными файлами одинакового размера? - PullRequest
2 голосов
/ 20 октября 2011

Обычно, чтобы выяснить, насколько два двоичных файла различаются, я использую инструменты diff и hexdump.Но в некоторых ситуациях, если даны два больших двоичных файла одинакового размера, я хотел бы видеть только их количественные различия, такие как количество областей различий, совокупное различие.

Пример: 2 файла A и B. Они имеют 2 области различия, и их совокупная разница составляет 6c-a3 + 6c-11 + 6f-6e + 20-22.

File A = 48 65 6c 6c 6f 2c 20 57
File B = 48 65 a3 11 6e 2c 22 57
              |--------|  |--|
                 reg 1   reg 2

Как я могу получить такую ​​информацию, используя стандартные инструменты GNU и Bash, или мне лучше использовать простой скрипт на Python?Другие статистические данные о том, как различаются 2 файла, также могут быть полезны, но я не знаю, что еще и как можно измерить?Разница энтропии?Разница дисперсии?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Для всего, кроме регионов, вы можете использовать numpy . Примерно так (не проверено):

import numpy as np
a = np.fromfile("file A", dtype="uint8")
b = np.fromfile("file B", dtype="uint8")

# Compute the number of bytes that are different
different_bytes = np.sum(a != b)

# Compute the sum of the differences
difference = np.sum(a - b)

# Compute the sum of the absolute value of the differences
absolute_difference = np.sum(np.abs(a - b))

# In some cases, the number of bits that have changed is a better
# measurement of change. To compute it we make a lookup array where 
# bitcount_lookup[byte] == number_of_1_bits_in_byte (so
# bitcount_lookup[0:16] == [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4])
bitcount_lookup = np.array(
    [bin(i).count("1") for i in range(256)], dtype="uint8")

# Numpy allows using an array as an index. ^ computes the XOR of
# each pair of bytes. The result is a byte with a 1 bit where the
# bits of the input differed, and a 0 bit otherwise.
bit_diff_count = np.sum(bitcount_lookup[a ^ b])

Я не смог найти единую функцию для вычисления регионов, но просто напишите свою собственную, используя a != b в качестве ввода, это не должно быть сложно. См. этот вопрос для вдохновения.

0 голосов
/ 20 октября 2011

Один подход, который приходит на ум, - это немного взломать алгоритм двоичного сравнения.Например, реализация Python алгоритма rsync .Исходя из этого, вам будет относительно легко получить список диапазонов блоков, в которых файлы различаются, и затем делать любую статистику, которую вы хотите сделать для этих блоков.

...