C语言如何计算xls文件的MD5
How to Calculate MD5 of xls file in C language
我对xls文件的MD5做了很多研究,但我的努力似乎是徒劳的
我试图在这个 link "" 中使用图书馆和推荐
但是,仍然给出错误的结果,
你能帮助我吗 ??
xls 文件的 MD5 与任何其他类型文件的 MD5 非常相同,因为它是按字节操作的。通过示例 openssl 实现 openssl/crypto/md5/md5.c 和 md5test.c(代码在 git://git.openssl.org/openssl.git 中)。
好吧,我曾经回答过您提供的 link,但后来问题被关闭了。
思路如下。首先将文件读入缓冲区。您可以使用以下函数执行此操作:
unsigned char * readFile(const char *path)
{
FILE * pFile;
long lSize;
unsigned char * buffer;
size_t result;
pFile = fopen (path , "rb" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
// terminate
fclose (pFile);
return buffer;
}
读取文件
unsigned char * data = readFile("c:\file.xls");
那么您必须对这个数据缓冲区应用MD5。您可以使用类似的代码
那个问题中的那个(虽然我不确定哪个 library/implementation
使用该问题的 md5 作者)。例如,
char hash[64] = {0};
md5_byte_t digest[16] = {0};
md5_init(&state);
md5_append(&state, (const md5_byte_t *)data, filesize);
md5_finish(&state,digest);
int i=0;
for(i; i<16; i++)
{
snprintf(hash + i*2,sizeof(hash),"%02x",digest[i]);
}
现在 hash
应该存储文件的哈希值,以十六进制字符串编码。 ps。事实上,该样本错误地使用 strlen
和二进制文件。这就是为什么我建议使用上面的 readFile
方法;该函数还包含获取文件大小的代码 - 您可以使用该代码获取文件大小,然后将文件大小传递给 md5_append
方法。
ps。完成后也不要忘记 free
data
。
问题是您的示例使用 strlen
来确定文件大小。但是 .xls
格式是二进制的,所以 strlen 将无法正常工作。
使函数适应 return 从文件中读取的总数据,它应该可以工作。
编辑。试试像这样的代码:
void *addr;
struct stat s;
int ret, fd;
ret = stat(filename, &s);
if (ret) {
fprintf(stderr, "Error while stat()ing file: %m\n");
return -1;
}
fd = open(filename, O_RDONLY);;
if (fd < 0) {
fprintf(stderr, "Error while opening file: %m\n");
return -1;
}
addr = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
fprintf(stderr, "Error while mapping file: %m\n");
close(fd);
return -1;
}
md5_init(&state);
md5_append(&state,addr, s.st_size);
md5_finish(&state,digest);
我对xls文件的MD5做了很多研究,但我的努力似乎是徒劳的 我试图在这个 link "" 中使用图书馆和推荐 但是,仍然给出错误的结果, 你能帮助我吗 ??
xls 文件的 MD5 与任何其他类型文件的 MD5 非常相同,因为它是按字节操作的。通过示例 openssl 实现 openssl/crypto/md5/md5.c 和 md5test.c(代码在 git://git.openssl.org/openssl.git 中)。
好吧,我曾经回答过您提供的 link,但后来问题被关闭了。 思路如下。首先将文件读入缓冲区。您可以使用以下函数执行此操作:
unsigned char * readFile(const char *path)
{
FILE * pFile;
long lSize;
unsigned char * buffer;
size_t result;
pFile = fopen (path , "rb" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
// terminate
fclose (pFile);
return buffer;
}
读取文件
unsigned char * data = readFile("c:\file.xls");
那么您必须对这个数据缓冲区应用MD5。您可以使用类似的代码 那个问题中的那个(虽然我不确定哪个 library/implementation 使用该问题的 md5 作者)。例如,
char hash[64] = {0};
md5_byte_t digest[16] = {0};
md5_init(&state);
md5_append(&state, (const md5_byte_t *)data, filesize);
md5_finish(&state,digest);
int i=0;
for(i; i<16; i++)
{
snprintf(hash + i*2,sizeof(hash),"%02x",digest[i]);
}
现在 hash
应该存储文件的哈希值,以十六进制字符串编码。 ps。事实上,该样本错误地使用 strlen
和二进制文件。这就是为什么我建议使用上面的 readFile
方法;该函数还包含获取文件大小的代码 - 您可以使用该代码获取文件大小,然后将文件大小传递给 md5_append
方法。
ps。完成后也不要忘记 free
data
。
问题是您的示例使用 strlen
来确定文件大小。但是 .xls
格式是二进制的,所以 strlen 将无法正常工作。
使函数适应 return 从文件中读取的总数据,它应该可以工作。
编辑。试试像这样的代码:
void *addr;
struct stat s;
int ret, fd;
ret = stat(filename, &s);
if (ret) {
fprintf(stderr, "Error while stat()ing file: %m\n");
return -1;
}
fd = open(filename, O_RDONLY);;
if (fd < 0) {
fprintf(stderr, "Error while opening file: %m\n");
return -1;
}
addr = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
fprintf(stderr, "Error while mapping file: %m\n");
close(fd);
return -1;
}
md5_init(&state);
md5_append(&state,addr, s.st_size);
md5_finish(&state,digest);