确定二进制文件的相似性

时间:2018-06-11 13:44:04

标签: c# algorithm testing

我正在编写围绕HTML到PDF流程的单元测试,并有一组示例输入HTML文件和一组表示预期结果的PDF。 我想比较这些以确定该过程已生成正确的输出。

显然,PDF文件中有一些非确定性组件,所以我不能直接进行二进制比较。我并不特别想深入研究解析PDF输出,所以我认为只需检查文件的差异就可以了(并且如果它们之间的差异,例如小于1%,则测试通过。) / p>

我不能简单地计算同一阵列位置中的不同字节,因为输出中可能存在轻微的大小差异,因此每个文件中的偏移量会略有不同。

所以,问题是,是否有一个经过验证的算法来确定2个大字节数组的一般内容有多大差异?

谢谢,

史蒂夫。

编辑:

附加图像以说明文件生成方式大致相同......

enter image description here

1 个答案:

答案 0 :(得分:0)

好的,所以我发现了一种似乎运作良好的方法。它不一定非常有效,但每次测试仍然在大约半秒内完成,所以它对我的目的来说很好。将其发布在此处,以防其他人离开。

它基本上只是对每个数组中的字节求和并计算差值:

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),我认为这可能是可以接受的。