【问题标题】:Inputting data to stringstream with hexadecimal representation使用十六进制表示将数据输入到字符串流
【发布时间】:2021-03-11 20:21:22
【问题描述】:

我正在尝试通过字符串流提取十六进制的哈希摘要,但在迭代数据时无法使其工作。

使用std::hex,我可以使用普通整数文字轻松做到这一点,如下所示:

#include <sstream>
#include <iostream>

std::stringstream my_stream;
my_stream << std::hex; 
my_stream << 100;

std::cout << my_stream.str() << std::endl; // Prints "64"

但是,当我尝试从摘要中推送数据时,它只是将数据解释为字符并将它们推送到字符串流中。这是函数:

#include <sstream>
#include <sha.h> // Crypto++ library required

std::string hash_string(const std::string& message) {
    using namespace CryptoPP;

    std::stringstream buffer;

    byte digest[SHA256::DIGESTSIZE]; // 32 bytes or 256 bits
    static SHA256 local_hash;

    local_hash.CalculateDigest(digest, reinterpret_cast<byte*>(
        const_cast<char*>(message.data())),
        message.length());

    // PROBLEMATIC PART
    buffer << std::hex; 
    for (size_t i = 0; i < SHA256::DIGESTSIZE; i++) {
        buffer << *(digest+i);
    }

    return buffer.str();
}

byte 类型只是 unsigned char 的 typedef,所以我不明白为什么它不能正确输入。使用std::cout 打印返回值会给正常字符解释带来 ASCI 混乱。为什么它在第一种情况下有效,而在第二种情况下无效?

例子:

std::string my_hash = hash_string("hello");
std::cout << hash << std::endl; // Prints: ",≥M║_░ú♫&Φ;*┼╣Γ₧←▬▲\▼ºB^s♦3bôïÿ$"

【问题讨论】:

  • &gt;&gt; std::hex &gt;&gt; data 也许?
  • 我试过了,但都不管用。

标签: c++ char stringstream crypto++ iomanip


【解决方案1】:

首先,std::hex 格式修饰符适用于整数,而不适用于字符。由于您尝试打​​印unsigned char,因此不应用格式修饰符。您可以通过转换为 int 来解决此问题。在您的第一个示例中,它之所以有效,是因为文字 100 被解释为整数。如果您将 100 替换为例如static_cast&lt;unsigned char&gt;(100),您将不再获得十六进制表示。

其次,std::hex 是不够的,因为您可能希望将每个字符填充为 2 位十六进制值(即,F 应打印为 0F)。您还可以通过应用格式修饰符 std::setfill('0')std::setw(2)referencereference)来解决此问题。

应用这些修改后,您的代码将如下所示:

#include <iomanip>

...

    buffer << std::hex << std::setfill('0') << std::setw(2);
    for (size_t i = 0; i < SHA256::DIGESTSIZE; i++) {
        buffer << static_cast<int>(*(digest+i));
    }

【讨论】:

  • 这正是我想要的!非常感谢您的好先生!
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2014-03-07
  • 2021-09-01
相关资源
最近更新 更多