将从 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# 中等效,并且必须将返回值写入文件