gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:44 24 4
gpt4 key购买 nike

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

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);
}

最佳答案

while ((c=fgetc(img1)) != EOF)

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

fread(&buffer1, 1,1, img1);

这从 img1 读取第二个字节.

fread(&buffer2, 1,1, img2);

这从 img2 读取第一个字节.

if(buffer1 != buffer2)

所以现在我们正在比较 img2 的第一个字节到 img1 的第二个字节.

如果它们碰巧相等,我们将再次循环,我们将比较 img2 的第二个字节。到 img1 的第四个字节.

看起来您可能认为 fgetc测试以查看是否有另一个字节可用,并且 fread然后阅读它。但不是。 fgetc从文件中读取一个字符,然后返回它。如果你写

c = fgetc(fp);

和你写的几乎一模一样

fread(&c, 1, 1, fp);

所以对您的程序的最小修复是摆脱

fread(&buffer1, 1,1, img1);

行,并将相等性测试改为

if(c != buffer2)

但这最终有点令人困惑——后来的读者可能会想知道,“为什么一个文件使用 fgetc 读取,而另一个使用 fread 读取?”

如果我正在写这个,我可能会从 img1 读取一个字节使用 getc , 和来自 img2 的一个字节使用 getc , 并比较它们。或者,我可能会使用 freadimg1 读取 N 个字节转换成一个字符数组,N 个字节来自 img2进入第二个字符 adday,并使用 memcmp 比较它们功能。

此外,正如 Paul Ogilvie 在评论中提到的那样,由于这些是二进制文件,当您调用 fopen 时要打开它们,您应该指定 "rb"模式。

关于在unix c中逐字节比较两张图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50177879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com