我正在编写围绕HTML到PDF流程的单元测试,并有一组示例输入HTML文件和一组表示预期结果的PDF。 我想比较这些以确定该过程已生成正确的输出。
显然,PDF文件中有一些非确定性组件,所以我不能直接进行二进制比较。我并不特别想深入研究解析PDF输出,所以我认为只需检查文件的差异就可以了(并且如果它们之间的差异,例如小于1%,则测试通过。) / p>
我不能简单地计算同一阵列位置中的不同字节,因为输出中可能存在轻微的大小差异,因此每个文件中的偏移量会略有不同。
所以,问题是,是否有一个经过验证的算法来确定2个大字节数组的一般内容有多大差异?
谢谢,
史蒂夫。
编辑:
附加图像以说明文件生成方式大致相同......
答案 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),我认为这可能是可以接受的。