我经过很多麻烦终于想出了这段代码。它计算文本文件的哈希值,并将哈希值添加到文件中。显然,这会改变哈希值,所以当我再次运行它时,我会得到另一个哈希值。
但是,如果我只想获取当前状态的哈希而不更改它 - 我应该在代码中更改什么?是“f = fopen(apszArgV[1],“rb+”);”谁导致哈希值改变?
#include <stdio.h>
#include "md5.h"
#define BUFFER_SIZE 1024
void print_hash(char hash[]);
int main (int iArgC, char *apszArgV[])
{
FILE *f;
MD5_CTX ctx;
BYTE byHash[16];
BYTE byBuffer[BUFFER_SIZE];
int iReadBytes;
if (iArgC < 2) {
printf ("Usage: md5_add <file name>\n");
return 1;
}
f = fopen (apszArgV[1], "rb+");
if (f != NULL) {
md5_init(&ctx);
while (!feof(f)) {
iReadBytes = fread(byBuffer, sizeof(BYTE), BUFFER_SIZE, f);
md5_update(&ctx, byBuffer, iReadBytes);
if (iReadBytes < BUFFER_SIZE) break;
}
md5_final(&ctx, byHash);
f = fopen("fil1.txt", "a");
for (int i = 0; i < 15; i++) {
fprintf (f, "%02X", byHash[i]);
}
fprintf(f, "\n");
fclose (f);
}
print_hash(byHash);
}
void print_hash(char hash[])
{
int idx;
for (idx=0; idx < 16; idx++)
printf("%02x",(int)((unsigned char)hash[idx]));
printf("\n");
}
谢谢
顺便说一句,c 语言新手
最佳答案
抱歉,现在无法发表评论。 与您实际上已经打开两个不同文件之前的问题不同。 老实说,我在你的代码中看不出为什么它仍然应该打印到你第一次读取散列的同一个文件,但我发现你需要清理。
1) 以一种可以看到它们实际作用的方式命名指针:
而不是
FILE *f;
给它命名
File * file_to_be_hashed;
然后最好为输出文件声明一个新名称。
FILE * listOfHashes = fopen("fil1.txt", "a");
使用完文件后,不要忘记关闭它们:
md5_final(&ctx, byHash)
fclose(f);
但正如所说,我真的不明白为什么你的代码仍然会打印到你的输入文件中,除了 fopen 到“fil2.txt”可能不起作用。我的猜测是文件 fil2.txt 尚不存在,因此无法按照您在 fopen("fil1.txt", "a"); 中指定的方式打开它进行追加;
而且第一个 fopen 没有理由是 rb+,因为 r 提供了足够的读取权限;-)
也许您了解 fopen 的开放标志实际上意味着什么...... http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html
关于c - 我如何修改这个程序,以便它在不修改文件的情况下计算哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673182/