我有很多麻烦后终于想出了这段代码。它计算文本文件的哈希值,并将哈希值添加到文件中。显然,这会改变哈希值,所以当我再次运行它时,我会得到另一个哈希值。
但是,如果我只想在不改变它的情况下获取当前状态的哈希值 - 我的代码应该改变什么?它是" 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");
}
感谢
ctw新手
答案 0 :(得分:0)
1)以某种方式命名指针,你可以看到他们实际做了什么:
而不是
FILE *f;
将其命名为
File * file_to_be_hashed;
然后更好地为输出文件声明一个新名称。
FILE * listOfHashes = fopen("fil1.txt", "a");
另外,请不要忘记在完成文件后关闭文件:
md5_final(&ctx, byHash)
fclose(f);
但是如上所述,我真的不明白为什么你的代码仍会打印到你的输入文件中,除非fopen to“fil2.txt”不起作用。我的猜测是文件fil2.txt尚不存在,所以无法打开,因为你在fopen(“fil1.txt”,“a”)中指定了追加;
同样没有理由让第一个fbn成为rb +,因为r提供了足够的阅读权利; - )
也许你了解fopen的开放标志究竟是什么意思...... http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html