通常,为了找到两个二进制文件的不同之处,我使用了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个文件如何不同的其他统计数据也很有用,但我不知道还有什么以及如何衡量?熵差异?差异?
答案 0 :(得分:1)
除了区域以外的所有内容,您都可以使用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])
我找不到用于计算区域的numpy函数,但只是使用a != b
作为输入编写自己的函数,它应该不难。请参阅this问题获取灵感。
答案 1 :(得分:0)
一种让人想到的方法是对二进制差分算法进行一些修改。例如。 a python implementation of the rsync algorithm。从那开始应该相对容易地获得文件不同的块范围列表,然后执行您想对这些块执行的任何统计。