测量两个二进制文件之间的相似性?

时间:2010-10-06 15:42:58

标签: binary comparison similarity

我有两个G729编码文件,我拿了它们的pcm版本。我想测量这两个文件之间的相似性。这些文件是二进制文件,所以如何测量二进制文件之间的相似性,我在C中编写了一个代码,从第一个文件中获取模式,在第二个文件中搜索类似文件,但我希望有一个相似度量...我在文献中搜索了很多,我发现了jaccard和其他人,但仍然不能确定哪一个符合我的情况。 提前感谢您的帮助..

2 个答案:

答案 0 :(得分:2)

由于您提到文件是音频文件,因此最好根据音频特征定义相似性度量,而不是简单地进行二进制比较。快速搜索提出了一个名为MusicMiner的研究项目,您可能希望了解更多想法。

答案 1 :(得分:0)

我有同样的需求,我提出了一个解决方案,在我的案例中工作,但我无法保证它是普遍的:

我拿了一个创建diff文件的库。给定fileA和fileB,该库创建第三个文件fileDiff,告诉如何从fileA传递到fileB要复制哪些字节以及要添加哪些字节。 (有关格式的更多信息:http://www.w3.org/TR/NOTE-gdiff-19970901.html

使用函数我得到一个百分比。 我知道这不是100%真实的,例如,如果你的fileB等于fileA的一半,那么函数的相似度就是100%。

这是DiffWriter实现:

public class Distance implements DiffWriter {

    private long newData = 0;
    private long copiedData = 0;

    @Override
    public void flush() throws IOException {}

    @Override
    public void close() throws IOException {}

    @Override
    public void addData(byte arg0) throws IOException {
        newData++;
    }

    @Override
    public void addCopy(long arg0, int arg1) throws IOException {
        copiedData += arg1;
    }

    public double getSimilarity() {

        double a = (double) newData;
        double c = (double) copiedData;

        return (( c / (c + a) ) * 100.0);

    }

}

以下是我的称呼方式:

import com.nothome.delta.Delta;

    File f1 = new File(...);
    File f2 = new File(...);

            Distance dw = new Distance();

    try {
        new Delta().compute(f1, f2, dw);

        dw.getSimilarity();

    } catch (Exception e) {
        e.printStackTrace();
    }