Put); return; } sha1_init (&ctx); while ( (n = fread (buffer, 1, sizeof buffer, fp))) sha1_write (&ctx, (unsigned char *)buffer, n); if (ferror (fp)) { printf("读取文件“%s”失败\n", FileNameInPut); return; } sha1_final (&ctx); fclose (fp); for ( i=0; i < 20; i++) { printf("%02x",ctx.buf[i]); } }
适合程序中调用的返回值方式:
/*获取文件的SHA1值,如果发生错误则将错误信息写入outError
* FileNameInPut:文件路径
* outSHA1:SHA1输出变量
* outError:错误信息输出变量
* returns:outSHA1
*/
char *GetFileSHA1(char *FileNameInPut, char *outSHA1, char *outError)
{
if(FileNameInPut==NULL)
{
if (outError != NULL)
{
sprintf(outError, "%s", "FileNameInPut Is NULL");
}
return outSHA1;
}
FILE *fp;
char buffer[4096];
size_t n;
SHA1_CONTEXT ctx;
int i;
fopen_s (&fp, FileNameInPut, "rb");
if (!fp)
{
if (outError != NULL)
{
sprintf(outError, "打开文件“%s”失败\n", FileNameInPut);
}
return outSHA1;
}
sha1_init (&ctx);
while ( (n = fread (buffer, 1, sizeof buffer, fp))) sha1_write (&ctx, (unsigned char *)buffer, n);
if (ferror (fp))
{
if (outError != NULL)
{
sprintf(outError, "读取文件“%s”失败\n", FileNameInPut);
}
return outSHA1;
}
sha1_final (&ctx);
fclose (fp);
for ( i=0; i < 20; i++)
{
sprintf(outSHA1 + 2*i, "%02x", (unsigned char)ctx.buf[i]);
}
outSHA1[2*i] = '\0';
return outSHA1;
}
水平有限,此方法只是简单的实现,还有些问题没有解决,希望高手指点一二,小弟不胜感激!
用法示例:
//用法实例:
int main (int argc, char **argv)
{
GetFileSHA1(*(argv+1));
printf("\r\n");
char sha1[41] = { 0 };
char eror[256] = { 0 };
printf("%s\r\n", GetFileSHA1(*(argv+1), sha1, NULL));
if (strlen(eror) != 0)
{
printf("获取SHA1发生错误:%s\r\n", eror);
}
printf("%s\r\n", GetFileSHA1(*(argv+1), sha1, eror));
if (strlen(eror) != 0)
{
printf("获取SHA1发生错误:%s\r\n", eror);
}
getchar();
return 0;
}
命令提示符下用法:
下载:http://download.csdn.net/detail/testcs_dn/7332933