我试图实现一个函数,它返回一个十六进制值字符串。我使用此函数打印十六进制值:
void print_hex(unsigned char *hash, const hashid type) {
int i;
for (i = 0; i < mhash_get_block_size(type); i++) {
printf("%.2x", hex[i]);
}
printf("\n");
}
这将输出一些十六进制值,例如
71c092a79cf30c4c7e7baf46a4af3c78cedec9ae3867d1e2600ffc39d58beaf2
如何修改此函数以使其返回字符串?即
unsigned char *get_hash_str(unsigned char *hash, const hashid type) { /* ?? */ }
(目标是稍后比较这两个值)
最佳答案
char * print_hex(const unsigned char *hash, const hashid type)
{
const char lookupTable[]="0123456789abcdef";
const size_t hashLength=mhash_get_block_size(type);
size_t i;
char * out=malloc(hashLength*2+1);
if(out==NULL)
return NULL;
for (i = 0; i < hashLength; i++)
{
out[i*2]=lookupTable[hash[i]>>4];
out[i*2+1]=lookupTable[hash[i]&0xf];
}
out[hashLength*2]=0;
return out;
}
显然,调用方负责
free
返回的字符串。不过,正如@K-Ballo在他的回答中正确地说的那样,您不需要将两个散列转换成字符串来进行比较,在这种情况下,您只需要一个
memcmp
。int compare_hashes(const unsigned char * hash1, const hashid hash1type, const unsigned char * hash2, const hashid hash2type)
{
if(hash1type!=hash2type)
return 0;
return memcmp(hash1, hash2, mhash_get_block_size(hash1type))==0;
}