使用libcrypto将哈希复制到字符数组

使用libcrypto将哈希复制到字符数组,c,hash,openssl,C,Hash,Openssl,下面是中可用的代码示例: 在下列情况之后: EVP_DigestFinal_ex(&mdctx, md_value, &md_len); 最终摘要存储在md_值中。我想将该摘要复制到另一个大小相同的字符数组中。但这是一个由两部分组成的问题。我不明白md_值中到底存储了什么,看起来像二进制文件。下面的printf将数据格式化为输出十六进制,这正是我所需要的。。所涉及哈希的最终字符串版本(在循环中,我有上下文: printf("val: %02x\n", md_value[i]);

下面是中可用的代码示例:

在下列情况之后:

EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
最终摘要存储在md_值中。我想将该摘要复制到另一个大小相同的字符数组中。但这是一个由两部分组成的问题。我不明白md_值中到底存储了什么,看起来像二进制文件。下面的printf将数据格式化为输出十六进制,这正是我所需要的。。所涉及哈希的最终字符串版本(在循环中,我有上下文:

printf("val: %02x\n", md_value[i]);
我的问题是,如何仅将十六进制值复制到另一个字符数组中。以下是我迄今为止尝试过的内容,就示例而言,这很糟糕:

for(i = 0; i < md_len; i++) {
    unsigned char c;
   printf("val: %02x\n", md_value[i]);
    sprintf(c, "%02x", md_value[i]);
    h[0] = c;
}

从您的问题中,我不确定您是否要复制原始数据或创建格式化的文本字符串

无论如何,要复制原始数据,memcpy是您想要的:

unsigned char *copy = malloc(md_len);
memcpy(copy, md_value, md_len);
如果要创建格式化字符串,则需要sprintf:

// each byte needs two chararacters for display plus 1 for terminating NULL
char *formatted = malloc(md_len * 2 + 1);

for (idx = 0; idx < md_len; ++idx)
{
    sprintf(formatted + idx * 2, "%02x", md_value[idx]);
}
//每个字节需要两个字符用于显示,另外1个字符用于终止NULL
char*formatted=malloc(md_len*2+1);
对于(idx=0;idx
奇怪的是,格式化的+idx*2是如何工作的?对于每个索引,它基本上为两个字符留出了空间?
// each byte needs two chararacters for display plus 1 for terminating NULL
char *formatted = malloc(md_len * 2 + 1);

for (idx = 0; idx < md_len; ++idx)
{
    sprintf(formatted + idx * 2, "%02x", md_value[idx]);
}