Setw和setfill,因为它在SHA256哈希函数中使用

时间:2016-12-18 06:12:44

标签: c++ hash openssl std

在学习OpenSSL的一些基础知识时,我遇到了create an SHA256 hash的代码:

$.get("viewData.php?action=getCat", function(json) {
    if(json.catArr.length>0) {
        $.each(json.catArr, function() 
        {
            catArr.push(this.category);
        });

        $.each(catArr, function(index, el) {
            console.log(el);
            $("#category_selector").append($('<option>', { 
                value: el,
                text : el
            }));
        });
    }
}, 'json');

有人可以尽可能简单地解释 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(); } 此具体示例中的作用,同时还能有效地解释它吗?

我似乎无法理解这些答案,但他们并没有帮助理解我的具体片段:

1 个答案:

答案 0 :(得分:3)

在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,输出到流会将其写为字符而不是小整数。< / p>

简而言之,

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

相当于C代码

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