在unix c中逐字节比较两张图片

Fab*_*mer 1 c unix compare image file

我写了这个方法来比较两个文件,特别是图片,并在输出中打印哪里是差异和它是什么.此时此结果是每个字节与另一个字节不同,但我正在比较的图像是相同的.你能帮我吗?这是代码:

void compareFiles(char* path1, char* path2){
    FILE* img1;
    FILE* img2;

    if((img1 = fopen(path1,"r")) == NULL || (img2 = fopen(path2,"r")) == NULL){
        printf("ERROR fopen()\n");
        exit(-1);
    }

    int i=0;
    char buffer1,buffer2;

    int c;
    while ((c=fgetc(img1)) != EOF){
        fread(&buffer1, 1,1, img1);
        fread(&buffer2, 1,1, img2);
        if(buffer1 != buffer2){
            printf("Byte differs\n IMG1: %s, IMG2: %s; Position %d\n",&buffer1,&buffer2,i);
            i++;
        }
    }

    fclose(img1);
    fclose(img2);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*mit 5

while ((c=fgetc(img1)) != EOF)
Run Code Online (Sandbox Code Playgroud)

这将从中读取第一个字节img1.假设它不是EOF......

fread(&buffer1, 1,1, img1);
Run Code Online (Sandbox Code Playgroud)

这将从中读取第二个字节img1.

fread(&buffer2, 1,1, img2);
Run Code Online (Sandbox Code Playgroud)

这将从中读取第一个字节img2.

if(buffer1 != buffer2)
Run Code Online (Sandbox Code Playgroud)

所以现在我们将第一个字节img2与第二个字节进行比较img1.

如果它们恰好相同,我们将再次绕过循环,我们将最终比较第二个字节img2到第四个字节img1.

看起来你可能已经考虑fgetc过测试是否有另一个字节可用,fread然后读取它.但不是. fgetc从文件中读取一个字符然后返回它.如果你写

c = fgetc(fp);
Run Code Online (Sandbox Code Playgroud)

它和你写的几乎完全一样

fread(&c, 1, 1, fp);
Run Code Online (Sandbox Code Playgroud)

所以对你的程序的最小修复就是摆脱它

fread(&buffer1, 1,1, img1);
Run Code Online (Sandbox Code Playgroud)

行,并将相等测试更改为

if(c != buffer2)
Run Code Online (Sandbox Code Playgroud)

但这最终会让人感到困惑 - 后来的读者可能会怀疑,"为什么一个文件正在使用fgetc,而另一个文件正在使用fread?"

如果我写这个,我可能读一个字节img1使用getc,并从一个字节的img2使用getc,并进行比较.或者,我可能会使用freadimg1字符数组读取N个字节,从img2第二个字符adday 读取N个字节,并使用该memcmp函数进行比较.

另外,正如Paul Ogilvie在评论中提到的,由于这些是二进制文件,当你打电话fopen打开它们时,你应该指定"rb"模式.