Quali informazioni descrivono la differenza quantitativa tra due file di grandi dimensioni della stessa dimensione?

StackOverflow https://stackoverflow.com/questions/7834123

Domanda

Di solito, per scoprire come due file binari sono diversi, utilizzo gli strumenti diff e hexdump.Ma in alcune situazioni se vengono forniti due file binari di grandi dimensioni della stessa dimensione, vorrei vedere solo le loro differenze quantitative, come il numero di regioni di differenze, la differenza cumulativa.

Esempio: 2 file A e B. Hanno 2 regioni diff e la loro differenza cumulativa è 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

Come posso ottenere tali informazioni usando gli strumenti GNU standard e Bash o dovrei usare meglio un semplice script Python?Anche altre statistiche su come 2 file sono diversi possono essere utili, ma non so cos'altro e come si può misurare?Differenza di entropia?Differenza di varianza?

È stato utile?

Soluzione

Per tutto tranne che per le regioni puoi utilizzare numpy .Qualcosa di simile (non testato):

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])

Non sono riuscito a trovare una funzione numpy per calcolare le regioni, ma scrivine una tua utilizzando a != b come input, non dovrebbe essere difficile.Vedi questa domanda perispirazione.

Altri suggerimenti

Un approccio che mi viene in mente è quello di modificare un po 'un algoritmo di differenza binaria.Per esempio. un'implementazione python dell'algoritmo rsync .Partendo da ciò, dovresti ottenere in modo relativamente semplice un elenco di intervalli di blocchi in cui i file differiscono, quindi eseguire le statistiche che desideri su quei blocchi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top