如何用C语言计算xls文件的MD5
我对xls文件的MD5做了很多研究,但我的努力似乎是徒劳的 我尝试在这个链接中使用lirary和Recommension 但是,仍然给出错误的结果,如何用C语言计算xls文件的MD5,c,xls,md5-file,C,Xls,Md5 File,我对xls文件的MD5做了很多研究,但我的努力似乎是徒劳的 我尝试在这个链接中使用lirary和Recommension 但是,仍然给出错误的结果, 你能帮我吗 xls文件的MD5与任何其他类型文件的MD5非常相似,因为它是以字节为单位操作的。请参见示例openssl实现openssl/crypto/md5/md5.c和md5test.c代码git://git.openssl.org/openssl.git xls文件的MD5与任何其他类型的文件的MD5非常相似,因为它是以字节为单位操作的。请参
你能帮我吗 xls文件的MD5与任何其他类型文件的MD5非常相似,因为它是以字节为单位操作的。请参见示例openssl实现openssl/crypto/md5/md5.c和md5test.c代码git://git.openssl.org/openssl.git xls文件的MD5与任何其他类型的文件的MD5非常相似,因为它是以字节为单位操作的。请参见示例openssl实现openssl/crypto/md5/md5.c和md5test.c代码git://git.openssl.org/openssl.git .嗯,我过去常回答你给出的链接,但后来问题就解决了。 想法如下。首先将文件读入缓冲区。可以使用以下功能执行此操作:
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。您可以使用类似的代码
尽管我不确定是哪个库/实现
md5的作者使用了这个问题。e、 g
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]);
}
现在散列应该存储文件的散列,用十六进制字符串编码。事实上,该示例错误地使用了带二进制文件的strlen。这就是为什么我建议使用上面的readFile方法;该函数还包含获取文件大小的代码-您可以使用该代码获取文件大小,然后将文件大小传递给md5_append方法
另外,当你使用完数据后,别忘了释放数据。好吧,我曾经回答过你给出的链接,但后来问题就解决了。 想法如下。首先将文件读入缓冲区。可以使用以下功能执行此操作:
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。您可以使用类似的代码
尽管我不确定是哪个库/实现
md5的作者使用了这个问题。e、 g
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]);
}
现在散列应该存储文件的散列,用十六进制字符串编码。事实上,该示例错误地使用了带二进制文件的strlen。这就是为什么我建议使用上面的readFile方法;该函数还包含获取文件大小的代码-您可以使用该代码获取文件大小,然后将文件大小传递给md5_append方法
另外,在处理完数据后不要忘记释放数据。问题在于,您的示例使用strlen来确定文件大小。但是.xls格式是二进制的,所以strlen不能正常工作 调整函数以返回从文件读取的总数据,它应该可以工作 编辑。请尝试以下代码:
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);
问题是您的示例使用strlen来确定文件大小。但是.xls格式是二进制的,所以strlen不能正常工作 调整函数以返回从文件读取的总数据,它应该可以工作 编辑。请尝试以下代码:
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?这没有意义,您应该将文件读取到缓冲区,然后在缓冲区上使用md5哈希算法的实现。文件的结构内容是不相关的-md5为任何字节流生成消息摘要。您链接到的问题是使用fp=fopenfile,r;打开一个文件。对于任何二进制文件(包括xls文件),这都会给出错误的结果。@M.a.E您所指的问题似乎已被删除…xls文件的MD5?这没有意义,您应该将文件读取到缓冲区,然后在缓冲区上使用md5哈希算法的实现。文件的结构内容是不相关的-md5为任何字节流生成消息摘要。您链接到的问题是使用fp=fopenfile,r;打开一个文件。对于任何二进制文件,包括xls文件,这都会给出错误的结果。@M.a.E您所指的问题似乎已被删除…@user300234是的,strCopy也不起作用,但这是相同的问题。无论如何,改进了我的答案。@user300234是的,strCopy也不会工作,但它是相同的问题。不管怎样,我的答案有所改进。