将格式化的打印值存储在新变量中

Store a formated printed value in a new variable

在加密函数 (sha256) 中,我有用于打印最终结果的代码:

void print_hash(unsigned char hash[]) 
   {
       int idx;
       for (idx=0; idx < 32; idx++)
          printf("%02x",hash[idx]);
       printf("\n");
    }

当函数中的 hash enter 是这样的:

/A�`�}#.�O0�T����@�}N�?�#=\&@

然后,通过循环,我在控制台中输入了这个

182f419060f17d2319132eb94f30b7548d81c0c740977d044ef1edbb9b97233d

我想知道如何将控制台中的最终值存储在变量中。 我已经阅读了一些关于 sscanf 的内容,但是你能帮我吗?

您可以使用 sprintf:

将其存储在数组中(通过指针传入参数)
void print_hash(unsigned char hash[], unsigned char output[])
{
    int idx;
    for (idx = 0; idx < 32; idx++)
        sprintf(&output[2 * idx], "%02x", hash[idx]);
}

一定要为output(即char output[2 * 32 + 1])中的空终止符保留一个额外的字节。

使用sprintf,此函数将其输出(相当于printf写入控制台的内容)存储在字符串缓冲区中。如何在您的案例中使用它的示例:

char buffer[65]; //Make this buffer large enough for the string and a nul terminator
for(int idx = 0; idx < 32; ++idx)
{
    sprintf(&buffer[2*idx], "%02x", hash[idx]); //Write to the correct position in the buffer
}

终止 nul 字符由 sprintf 自动附加。

您也可以避免使用 sprintf() 并像这样制作更高效的函数

void
hash2digest(char *result, const char *const hash, size_t length)
{
    const char *characters = "0123456789abcdef";
    for (size_t i = 0 ; i < length ; ++i)
    {
        result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
        result[2 * i + 1] = characters[hash[i] & 0x0F];
    }
    result[2 * length] = '[=10=]';    
}

请注意,您可以像这样从任何地方调用它(假设 hash 已经声明和定义)

char digest[65];
hash2digest(digest, hash, 32);

这又可以重复用于 SHA1 例如,像这样

char digest[41];
hash2digest(digest, hash, 20);

并使用动态内存分配

char *
hash2digest(const char *const hash, size_t length)
{
    const char *characters = "0123456789abcdef";
    char *result;
    result = malloc(2 * length + 1);
    if (result == NULL)
        return NULL;
    for (size_t i = 0 ; i < length ; ++i)
    {
        result[2 * i] = characters[(hash[i] >> 0x04) & 0x0F];
        result[2 * i + 1] = characters[hash[i] & 0x0F];
    }
    result[2 * length] = '[=13=]';

    return result;
}