将从 SHA1 返回的 unsigned char* 转换为字符串

Posted

技术标签:

【中文标题】将从 SHA1 返回的 unsigned char* 转换为字符串【英文标题】:Coverting unsigned char* returned from SHA1 to a string 【发布时间】:2012-06-27 23:33:31 【问题描述】:

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

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

SHA1(ibuf, strlen(ibuf), obuf);
for (i = 0; i < 20; i++) 
        printf("%02x ", obuf[i]);

【问题讨论】:

【参考方案1】:

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

char out[61]; //null terminator
for (i = 0; i < 20; i++) 
    snprintf(out+i*3, 4, "%02x ", obuf[i])

编辑:我看到你已经标记了你的问题 C++。这是一个纯粹的 C 解决方案,主要是因为我不懂 C++。

我们使用的最大大小为 4,因为我们需要在该计数中包含空终止符(通过函数定义)。我们只向前移动了三个,专门覆盖空终止符。

根据我们"%02x "的格式字符串,最后的额外空间必然会发生,但是如果我们对最后一个元素进行特殊处理,我们可以使用"%02x"的不同格式字符串来避免这种情况。

【讨论】:

谢谢克里斯蒂安。您能否解释一下为什么最大大小为 4 以及为什么您在输出缓冲区中每 3 个位置后写入一次。因为额外的空间被写入了缓冲区。 这会导致任何问题:char out[41]; for(i=0; i 呃,不,这不会导致任何问题,但是如果您只想为每个元素写入两个字符,则最好从格式字符串中删除尾随空格。

以上是关于将从 SHA1 返回的 unsigned char* 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

unsigned char ** 在 c# 中等效,并且必须将返回值写入文件

如何定义 swig 类型映射以将 unsigned char* 返回到 java

带有 unsigned char * 的内存泄漏

unsigned char ** 到 opencv mat

C# PInvoke 传递出 unsigned char*

将 swift 4 字符串转换为 c unsigned char *