如何修改此程序以便在不修改文件的情况下计算哈希值?

时间:2017-10-10 18:06:25

标签: c

我有很多麻烦后终于想出了这段代码。它计算文本文件的哈希值,并将哈希值添加到文件中。显然,这会改变哈希值,所以当我再次运行它时,我会得到另一个哈希值。

但是,如果我只想在不改变它的情况下获取当前状态的哈希值 - 我的代码应该改变什么?它是" 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新手

1 个答案:

答案 0 :(得分:0)

抱歉,现在无法发表评论。 与实际上已经打开2个不同文件之前的问题不同。 说实话,我没有在你的代码中看到为什么它仍然应该打印到你第一次读取的用于散列的文件,但我发现你需要清理它。

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