Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定二进制文件的相似性_C#_Algorithm_Testing - Fatal编程技术网

C# 确定二进制文件的相似性

C# 确定二进制文件的相似性,c#,algorithm,testing,C#,Algorithm,Testing,我正在围绕HTML到PDF的过程编写单元测试,有一组示例输入HTML文件和一组表示预期结果的PDF。 我想比较这些,以确定流程是否生成了正确的输出 显然PDF文件中有一些不确定的组件,所以我不能直接进行二进制比较。我并不特别想深入分析PDF输出,因此我认为只检查文件之间的差异(如果它们的差异小于1%,则通过测试)可能很好 我不能简单地计算同一数组位置中的不同字节,因为输出中可能会有轻微的大小差异,因此每个文件中的偏移量会略有不同 因此,问题是,是否有一种经过验证的算法来确定两个大字节数组的一般内

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

显然PDF文件中有一些不确定的组件,所以我不能直接进行二进制比较。我并不特别想深入分析PDF输出,因此我认为只检查文件之间的差异(如果它们的差异小于1%,则通过测试)可能很好

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

因此,问题是,是否有一种经过验证的算法来确定两个大字节数组的一般内容有多大的差异

谢谢

史蒂夫

编辑:

附加一个图像以说明生成的文件大致相同


好的,我找到了一种似乎很有效的方法。它的效率不一定非常高,但每个测试仍然在大约半秒钟内运行,因此对于我来说,这是很好的。在这里发布,以防它帮助其他人

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

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;
}
public static bool IsAnalogousTo(此字节[]左,字节[]右,整数容差)
{
长左和=0;
foreach(左侧的变量b)
{
leftSum+=b;
}
长右和=0;
foreach(右侧的变量b)
{
rightSum+=b;
}
返回Math.Abs(leftSum-rightSum)
我的想法是,文件大小约为115k—如果该大小的文件中所有字节的总和小于15k,则这意味着每十个字节中少于一位(公差参数)是不同的

这是我想要的。对于需要更高精度的其他用途,可能最好分块执行,以确保文件的区域相似


当然,对于一小部分数据来说,这是没有用的。可以说[10,20,30,40]和[0,0,0,100]是相同的,但对于115000字节的合理结构数据(如PDF),我认为这可能是可以接受的。

2-3个月前,我们对一些PDF表单(带有嵌入式文本输入字段)进行了类似的处理,发现使用Aspose提取所有字段及其值并进行比较比比较字节流更容易,字节流可能会发生很大变化,与文本条目中的微小变化不成比例。我建议您采用类似的方法。比较字节流并不像我们预期的那样有用。PDF意味着压缩,那么“百分比差异”到底意味着什么呢?它几乎是一个散列函数。你可以在文本和98%的字节上有一点不同。如果我用二进制并排打开这些文件,它们大体上是一样的。我将附上一张图片来说明。你不信任你的PDF生成器实用程序?在这种情况下,在html转换为PDF之前验证html不是更容易吗?这并没有回答问题:“两个文件之间的百分比差异”以一种迂回的方式——如果每十个字节中有一个位的差异,那么这将是1.25%的差异。通过一点数学运算,该方法可以修改为接受一个百分比。实际上不是。如果一个字节从0变为10,另一个字节从10变为0,那么和差为零,而百分比差为100%(假设文件只有两个字节)。这两个文件之间甚至没有近似的百分比差异。此算法不会告诉您在总字节数中更改了多少字节。如果和差是10,是10个字节变了,1个字节变了,还是1000个?没有办法说。我同意——因此,如果你真的担心准确性的话,我在回答中的评论是,分块执行。为了比较PDF,如果一个合理可预测的结构化文件115k的所有字节之和只有几千字节,那么这些文件很可能是相似的。