【发布时间】:2020-08-07 10:32:58
【问题描述】:
我写了一个简单的复制程序,复制文件并生成MD5,它运行并正确生成MD5。
但是,在验证复制功能生成的文件时,它与源 MD5 不匹配。我在我的代码中看不到任何原因,有人可以帮忙吗?
#include <stdio.h>
#include <openssl/md5.h>
#include <assert.h>
#define BUFFER_SIZE 512
int secure_copy(char *filepath, char *destpath);
int main(int argc, char * argv[]) {
secure_copy(argv[1], argv[2]);
return 0;
}
int secure_copy(char *filepath, char *destpath) {
FILE *src, *dest;
src = fopen(filepath, "r");
assert(src != NULL);
dest = fopen(destpath, "w");
assert(dest != 0);
MD5_CTX c;
char buf[BUFFER_SIZE];
ssize_t bytes, out_writer;
unsigned char out[MD5_DIGEST_LENGTH];
MD5_Init(&c);
while((bytes = fread(buf, 1, BUFFER_SIZE, src)) != 0) {
MD5_Update(&c, buf, bytes);
out_writer = fwrite(buf, 1, BUFFER_SIZE, dest);
assert(out_writer != 0);
}
MD5_Final(out, &c);
printf("MD5: ");
for (int i=0; i < MD5_DIGEST_LENGTH; i++)
{
printf("%02x", out[i]);
}
printf("\n");
fclose(src);
fclose(dest);
return 0;
}
输出
$ ./md5speed doc.txt /home/doc.txt
MD5: 4c55e4b9185eece3cc000c4023f8f6fe
当使用md5sum 验证复制的文件时,我得到一个完全不同的哈希值。
md5sum doc.txt
29cb4da30c3e28fdb81463b5f0a76894 doc.txt
虽然文件仍然打开并且内容未损坏。
【问题讨论】:
-
你应该使用
"rb"和"wb"这样文件将被二进制处理。 -
如果没有二进制文件,您的
MD5_Update将在已翻译 cr/lf 的数据上运行。但是,写入会再次添加 cr(或 lf),因此生成的文件就可以了。 -
啊,是的,谢谢!这些东西的结合现在正在起作用。你能解释一下用字节替换 Buffer 大小的效果吗?
-
与根本问题无关,但您对
assert的使用不合适。assert应该用于检测代码中的逻辑错误,而不是输入/输出错误。 -
谢谢,它只是一个快速的程序,通过
/usr/bin/time -v在shell中测试函数的速度