我想在Linux C中找到文件的md5sum,是否有任何API可以發送文件名以獲得該文件的md5sum。Linux中文件的md5sum C
22
A
回答
32
有代碼here。
而且,在OpenSSL庫有MD5函數(從here):
#include <openssl/md5.h>
#include <unistd.h>
int main()
{
int n;
MD5_CTX c;
char buf[512];
ssize_t bytes;
unsigned char out[MD5_DIGEST_LENGTH];
MD5_Init(&c);
bytes=read(STDIN_FILENO, buf, 512);
while(bytes > 0)
{
MD5_Update(&c, buf, bytes);
bytes=read(STDIN_FILENO, buf, 512);
}
MD5_Final(out, &c);
for(n=0; n<MD5_DIGEST_LENGTH; n++)
printf("%02x", out[n]);
printf("\n");
return(0);
}
12
您可以使用popen
運行md5sum
和讀取輸出:
#include <stdio.h>
#include <ctype.h>
#define STR_VALUE(val) #val
#define STR(name) STR_VALUE(name)
#define PATH_LEN 256
#define MD5_LEN 32
int CalcFileMD5(char *file_name, char *md5_sum)
{
#define MD5SUM_CMD_FMT "md5sum %." STR(PATH_LEN) "s 2>/dev/null"
char cmd[PATH_LEN + sizeof (MD5SUM_CMD_FMT)];
sprintf(cmd, MD5SUM_CMD_FMT, file_name);
#undef MD5SUM_CMD_FMT
FILE *p = popen(cmd, "r");
if (p == NULL) return 0;
int i, ch;
for (i = 0; i < MD5_LEN && isxdigit(ch = fgetc(p)); i++) {
*md5_sum++ = ch;
}
*md5_sum = '\0';
pclose(p);
return i == MD5_LEN;
}
int main(int argc, char *argv[])
{
char md5[MD5_LEN + 1];
if (!CalcFileMD5("~/testfile", md5)) {
puts("Error occured!");
} else {
printf("Success! MD5 sum is: %s\n", md5);
}
}
2
可以使用mhash庫(許可證是LGPL)。在Debian系統:
sudo apt-get install libmhash-dev
參見手冊頁man 3 mhash
但我不認爲你可以給它一個文件名。您必須自己打開文件,讀取數據,然後將數據提供給該庫的函數。
0
如果您希望爲文件生成MD5哈希並將其與字符串進行比較,則可以使用該哈希。我使用了D'Nabre's code from another SO answer和Michael Foukarakis's hex string to byte array code from this SO answer。 它需要鏈接到OpenSSL庫(gcc md5.c -o md5 -lssl)才能正常工作。
使用範例:
unsigned char *file_hash = md5_for_file("~/testfile");
if (md5_is_match_str(file_hash, "b7be4ec867f9b0286b91dd40178774d6")) {
printf("Match\n");
} else {
printf("Mismatch\n");
}
free(file_hash);
md5.h:
#ifndef MD5_H
#define MD5_H
/** Caller to free result */
unsigned char *md5_for_file(char *filename);
/** md5_1 & md5_2 maybe NULL */
int md5_is_match(unsigned char *md5_1, unsigned char *md5_2);
/** md5 maybe NULL */
int md5_is_match_str(unsigned char *md5, const char *md5_str);
#endif //MD5_H
md5.c:
#include "md5.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>
// Print the MD5 sum as hex-digits.
void print_md5_sum(unsigned char *md) {
int i;
for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", md[i]);
}
printf("\n");
}
// Get the size of the file by its file descriptor
unsigned long get_size_by_fd(int fd) {
struct stat statbuf;
if (fstat(fd, &statbuf) < 0) exit(-1);
return statbuf.st_size;
}
unsigned char *md5_for_file(char *filename) {
int file_descript;
unsigned long file_size;
char *file_buffer;
unsigned char *result = malloc(sizeof(*result) * MD5_DIGEST_LENGTH);
if (NULL == result) {
printf("malloc failed\n");
goto END;
}
printf("using file:\t%s\n", filename);
file_descript = open(filename, O_RDONLY);
if (file_descript < 0) exit(-1);
file_size = get_size_by_fd(file_descript);
printf("file size:\t%lu\n", file_size);
file_buffer = mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0);
MD5((unsigned char *) file_buffer, file_size, result);
munmap(file_buffer, file_size);
print_md5_sum(result);
END:
return result;
}
int md5_is_match(unsigned char *md5_1, unsigned char *md5_2) {
if (!md5_1 || !md5_2) {
return 0;
}
int i;
for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
if (md5_1[i] != md5_2[i]) {
return 0;
}
}
return 1;
}
int md5_is_match_str(unsigned char *md5, char *md5_str) {
if (!md5 || !md5_str) { return 0; }
/** Make byte arrary from md5_str */
unsigned char md5_arr[MD5_DIGEST_LENGTH] = {0};
const char *pos = md5_str;
size_t count = 0;
/* WARNING: no sanitization or error-checking whatsoever */
for (count = 0; count < sizeof(md5_arr)/sizeof(md5_arr[0]); count++) {
sscanf(pos, "%2hhx", &md5_arr[count]);
pos += 2;
}
for (count = 0; count < sizeof(md5_arr)/sizeof(md5_arr[0]); count++) {
printf("%02x", md5_arr[count]);
}
printf("\n");
/** actual comparison */
if (memcmp(md5, md5_arr, MD5_DIGEST_LENGTH)) {
return 0;
}
return 1;
}
0
一個簡單問題的答案由拉賈提出並使用回答sje397 ,可以在C程序中計算文件的md5sum,如下所示。另外請注意,當您使用do while循環時,不需要再次編寫讀命令。
int calculate_md5sum(char *filename)
{
//open file for calculating md5sum
FILE *file_ptr;
file_ptr = fopen(filename, "r");
if (file_ptr==NULL)
{
perror("Error opening file");
fflush(stdout);
return 1;
}
int n;
MD5_CTX c;
char buf[512];
ssize_t bytes;
unsigned char out[MD5_DIGEST_LENGTH];
MD5_Init(&c);
do
{
bytes=fread(buf, 1, 512, file_ptr);
MD5_Update(&c, buf, bytes);
}while(bytes > 0);
MD5_Final(out, &c);
for(n=0; n<MD5_DIGEST_LENGTH; n++)
printf("%02x", out[n]);
printf("\n");
return 0;
}
相關問題
- 1. md5sum不同於linux和windows
- 2. 在linux上刪除' - 'md5sum
- 3. md5sum包含總和本身的文件?
- 4. 是否有任何函數可以在linux中獲取文件的md5sum值?
- 5. 在C上創建的md5sum
- 6. Makefile中的MD5SUM
- 7. Bash得到一個文件夾中的所有文件的md5sum
- 8. `的md5sum -c`不會與Apache的MD5文件格式工作
- 9. 通過Crypto.js獲取文件的md5sum
- 10. 如何獲得DEB文件的MD5Sum
- 11. md5sum linux命令是否正常工作?
- 12. .c Slax-Linux上的文件
- 13. Zip工具在Linux中每次給我不同的md5sum
- 14. 在Linux中打印查找命令的結果md5sum
- 15. LINUX C編程中的文件路徑
- 16. c文件中的linux命令行
- 17. 將文本轉換爲md5sum值的批處理文件
- 18. 批處理文件檢查日誌文件的md5sum
- 19. 檢查文件中是否存在現有的md5sum - Shell腳本
- 20. 如何在Java中獲取文件的md5sum?
- 21. Utf8 Linux文件名和C
- 22. LINUX/C++第二個文件
- 23. c + + - 在Linux中監視mount文件夾
- 24. C++在Linux中創建2個文件
- 25. 在Linux中使用C創建文件
- 26. C++在linux中添加頭文件-g ++
- 27. 未在Linux中安裝C頭文件
- 28. 在Linux中同步讀取文件C
- 29. Linux管道尋找和md5sum不發送輸出
- 30. 的Linux:從源文件中
感謝您分享這裏的例子! ('out'應該是一個'unsigned char'和長度爲'MD5_DIGEST_LENGTH'的數組,並且最後一個'printf(「\ n」);'避免在終端上看到虛假的字符。) – 2011-02-18 14:24:02
@Andre Holzner:固定。乾杯。 – sje397 2011-02-20 22:59:53
當將其轉換爲使用'FILE'輸入時,我必須使用fread而不是讀取,否則我會得到不同的散列 – nmz787 2018-01-26 06:15:58