将从SHA1返回的无符号字符*转换为字符串 我用C++为任何数据创建了一个Sh1哈希。但是SHA1调用的输出缓冲区是一个无符号字符*。我想存储十六进制值,即消息摘要值,以便我可以将它们用于其他操作

将从SHA1返回的无符号字符*转换为字符串 我用C++为任何数据创建了一个Sh1哈希。但是SHA1调用的输出缓冲区是一个无符号字符*。我想存储十六进制值,即消息摘要值,以便我可以将它们用于其他操作,c++,hex,sha1,unsigned-char,C++,Hex,Sha1,Unsigned Char,因为它们是无符号字符*,所以将它们转换为字符串然后执行十六进制转换是没有意义的。所以我必须进行十六进制转换,然后将值存储为字符串或字符*。我该怎么做 SHA1(ibuf, strlen(ibuf), obuf); for (i = 0; i < 20; i++) { printf("%02x ", obuf[i]); SHA1(ibuf、strlen(ibuf)、obuf); 对于(i=0;i

因为它们是无符号字符*,所以将它们转换为字符串然后执行十六进制转换是没有意义的。所以我必须进行十六进制转换,然后将值存储为字符串或字符*。我该怎么做

SHA1(ibuf, strlen(ibuf), obuf);
for (i = 0; i < 20; i++) {
        printf("%02x ", obuf[i]);
SHA1(ibuf、strlen(ibuf)、obuf);
对于(i=0;i<20;i++){
printf(“%02x”,obuf[i]);

要格式化为
字符[]
,请使用
snprintf

char out[61]; //null terminator
for (i = 0; i < 20; i++) {
    snprintf(out+i*3, 4, "%02x ", obuf[i])
}
char out[61];//空终止符
对于(i=0;i<20;i++){
snprintf(out+i*3,4,“%02x”,obuf[i])
}
<>编辑:我看到你已经标记了你的问题C++。这是一个纯粹的C解决方案,主要是因为我不知道C++。 我们使用的最大大小为4,因为我们需要在该计数中包含空终止符(根据函数定义)。我们只需要向前移动3,以覆盖空终止符


根据格式字符串
%02x”
,最后的额外空间肯定会出现,但是如果我们对最后一个元素进行特殊处理,我们可以使用另一个格式字符串
%02x“
以避免出现这种情况。

谢谢Christian。请您解释一下为什么最大大小为4,以及为什么要在输出缓冲区中每3个位置后写入。因为会向输出缓冲区写入额外的空间。这会导致任何问题吗:char out[41];例如(i=0;i-Erm,不,这不会引起任何问题,但是如果您只打算为每个元素写入两个字符,那么您还可以从格式字符串中删除尾随空格。