在SHA256哈希函数中使用的setw和setfill是什么意思?

3
学习OpenSSL的基础知识时,我遇到了创建SHA256哈希的代码:create an SHA256 hash
using namespace std;

    #include <openssl/sha.h>
    string sha256(const string str)
    {
        unsigned char hash[SHA256_DIGEST_LENGTH];
        SHA256_CTX sha256;
        SHA256_Init(&sha256);
        SHA256_Update(&sha256, str.c_str(), str.size());
        SHA256_Final(hash, &sha256);
        stringstream ss;
        for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
        {
            ss << hex << setw(2) << setfill('0') << (int)hash[i];
        }
        return ss.str();
    }

这段代码的作用是将哈希值的十六进制表示转换成字符串。具体来说,它将哈希值的每个字节转换成两位的十六进制数,并将它们连接起来形成一个字符串。
更详细地说,代码中的“ss”是一个字符串流对象,“hex”是一个标志,指示后面的整数应以十六进制输出。“setw(2)”和“setfill('0')”是控制输出格式的函数,它们确保每个十六进制数都有两位,并在必要时用零填充。最后,“(int)hash[i]”将哈希值的第i个字节转换为整数,然后将其附加到字符串流中。

你知道每个操纵符单独做什么吗?在打印到std::cout时,你尝试过对它们进行实验吗? - undefined
那你应该找一本好的入门书籍,它会解释这些“操作符”以及它们的作用。你也可以将输出改为cout而不是ss,看看结果如何。最重要的是要实践! :) - undefined
1
@Someprogrammerdude 我并不是很了解std::相关的知识,因为我刚从C转到C++,一下子学习所有内容并理解文档对我来说有些困难。 - undefined
1个回答

4
在C++中有许多不同的流。您可能已经知道使用cout将输出写入控制台,使用cin读取输入。 stringstream 是一个类,其对象可以写入和读取string 对象。像变量ss这样写入字符串流就像向cout写入一样,但是写入的是字符串而不是控制台。
您说您已经编程过C?那么您应该知道十六进制表示法,对吧?这就是 hex 操纵符 告诉流使用的内容。这类似于printf格式说明符"%x" setw 操纵符 设置下一个输出的字段宽度。 setfill 操纵符 设置输出的填充字符。
最后,将hash[i]强制转换为int是因为hash[i]是一个char,并且输出到流中将其写入为字符而不是小整数。
简而言之,
ss << hex << setw(2) << setfill('0') << (int)hash[i];

等同于C代码

sprintf(temporaryBuffer, "%02x", hash[i]);
strcat(ss, temporaryBuffer);

完美的答案。非常清楚地理解了整个问题! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接