【问题标题】:Setw and setfill as it's used in a SHA256 hash functionSetw 和 setfill 用于 SHA256 哈希函数
【发布时间】:2016-12-18 06:12:43
【问题描述】:

在使用 OpenSSL 学习一些基础知识时,我遇到了 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 &lt;&lt; hex &lt;&lt; setw(2) &lt;&lt; setfill('0') &lt;&lt; (int)hash[i];这个具体示例中做了什么,同时仍然有效地解释它?

由于我似乎无法理解这些答案,因此它们无助于理解我的具体 sn-p:

【问题讨论】:

  • 你知道每个manipulators 自己做什么吗?您是否尝试在打印到std::cout 时尝试使用它们?
  • 那么您可能应该find a good beginners book,因为它应该解释这些操纵器以及它们的作用。你也可以输出到cout 而不是ss,看看你得到了什么。最重要的是,实验! :)
  • @Someprogrammerdude 我不知道,我对 std:: 几乎一无所知,因为我只是从 C 切换到 c++,而且我很难一次学习所有内容并理解文档

标签: c++ hash openssl std


【解决方案1】:

在 C++ 中有许多不同的。您可能知道cout 将输出写入控制台,cin 读取输入。 stringstream 是一个类,其对象写入和读取 string 对象。写入字符串流(如变量ss)就像写入cout,但写入的是字符串而不是控制台。

你说你已经编写了 C 语言?那你应该知道十六进制,对吧?这就是the hex manipulator 告诉流使用的内容。这类似于printf 格式说明符"%x"

The setw manipulator 设置下一个输出的字段宽度。

The setfill manipulator 设置输出的 fill 字符。

最后将hash[i] 转换为int 是因为hash[i]char,并且输出到流中会将其写入为字符而不是小整数。

总之,

ss << hex << setw(2) << setfill('0') << (int)hash[i];

相当于C代码

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

【讨论】:

  • 完美答案。很好地理解了整个问题!
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2013-07-10
  • 2021-10-06
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多