gpt4 book ai didi

c - 在以相反顺序比较文件时查找特殊情况

转载 作者:太空宇宙 更新时间:2023-11-04 03:27:02 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BS 12

void reverse(char * buffer, int size)
{
char tmp;
int i;
for(i = 0; i < size / 2; i++)
{
tmp = (char)buffer[i];
buffer[i] = buffer[size - i - 1];
buffer[size - i - 1] = tmp;
}
}

int compare_bin(char * buffer, char * buffer2, int size)
{
// because strncmp is only for string without \x00, so there must be a customized compare function
int i;
for(i = 0; i < size; i++)
{
if(buffer[i] != buffer2[i])
return 0;
}
return 1;
}

int main (const int argc, const char** argv)
{
if(argc != 3)
exit(-1);

int equal = 1;
char * buffer = malloc(BS), * buffer2 = malloc(BS);
FILE * f1, * f2;
f1 = fopen(argv[1], "r");
f2 = fopen(argv[2], "r");

fseek(f1, 0, SEEK_END);
fseek(f2, 0, SEEK_END);

long i = ftell(f1), j = ftell(f2);
if(i != j)
{
equal = 0;
goto endp;
}

fseek(f2, 0, SEEK_SET);

int need = 0;
int count;
int f2_pos = 0;

do
{
i = i - BS;
if(i < 0)
{
need = BS - abs((int)i);
i = 0;
}
else
need = BS;

fseek(f1, i, SEEK_SET);
count = fread(buffer, need, 1, f1);

reverse(buffer, count * need);
// fwrite(buffer, count * need, 1, f2);
fread(buffer2, need * need, 1, f2);

// printf("compare...\n");
// for(int i = 0; i < need * count; i++)
// {
// printf("%02hhX", buffer[i]);
// }
// printf("\n");
// for (int i = 0; i < need * count; i++)
// {
// printf("%02hhX", buffer2[i]);
// }
// printf("\n");


if(compare_bin(buffer, buffer2, need * count) == 0)
{
equal = 0;
break;
}

f2_pos += need * count;
fseek(f2, f2_pos, SEEK_SET);

if(i == 0)
break;
}while(i > 0);

fclose(f1);
fclose(f2);
free(buffer);
free(buffer2);

endp:
if(equal)
return 0;
else
{
printf("2 files not equal is reversed order\n");
return 1;
}

return 0;
}

所以我写了一个程序来比较文件内容的倒序。我已经在二进制文件中考虑过 \x00 并且未使用 strncmp 。但仍有缺陷。有一个测试服务器来测试这个程序。但我无权访问它。该程序在该服务器上总是失败。所以一定是有一些特殊情况才会让它失败。任何想法?

还有其他解决方法。比如计算MD5。但我想解决这个问题。

最佳答案

对于您读取数据的第一次迭代

fread(buffer2, need * need, 1, f2);

问题是在那种情况下need12,这是分配给buffer2的内存大小,但是你要求读取 12 * 12 字节。

如果第二个文件足够大,您将在内存中写入越界,导致未定义的行为。如果文件不够那么您将无法阅读任何内容。

还要注意 fread 的两个中间参数的顺序事情。如果您更改了顺序,无论文件是否大于 need * need,都会超出缓冲区的范围。你应该真正阅读 count 字节大小的对象(第二个参数应该是 1 第三个应该是 count,这当然意味着你需要也可以在第一次通话中更改顺序)。

简而言之,您的两个 fread 调用应该是

count = fread(buffer, 1, BS, f1);
fread(buffer2, 1, count, f2);

附言。不要忘记错误检查。

关于c - 在以相反顺序比较文件时查找特殊情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323566/

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