c将带有“:”的十六进制字符串转换为原始的“二进制”字符串

我有以下代码将加密的密文转换为可读的十六进制格式:

std::string convertToReadable(std::string ciphertext)
{
    std::stringstream outText;

    for(unsigned int i = 0; i < ciphertext.size(); i++ )
        outText << std::hex << std::setw(2) << std::setfill('0') << (0xFF & static_cast<byte>(ciphertext[i])) << ":";

    return outText.str();
}

该函数的可读结果如下:

56:5e:8b:a8:04:93:e2:f1:5c:20:8b:fd:f5:b7:22:0b:82:42:46:58:9b:d4:c1:8e:ac:62:85:04:ff:7f:c6:d3:

现在我需要回过头来,将可读格式转换为原始密文以便解密它:

std::string convertFromReadable(std::string text)
{
    std::istringstream cipherStream;

    for(unsigned int i = 0; i < text.size(); i++ )
    {
        if (text.substr(i, 1) == ":")
            continue;

        std::string str = text.substr(i, 2);
        std::istringstream buffer(str);
        int value;
        buffer >> std::hex >> value;
        cipherStream << value;
    }

    return cipherStream.str();
}

这不是绝对有效的,因为我得到了错误的字符串.

如何修复convertFromReadable()以便我可以恢复原始密文?

谢谢你的帮助

最佳答案
以下是在进一步调试之前应该修复的问题:

> cipherStream应该是ostringstream,而不是istringstream
> for循环应在结束前停止两个字符.否则你的substr将会失败.使循环条件i 2<字体大小()
>当你从输入中读取两个字符时,你需要将i提前两个,即在std :: string str = text.substr(i,2)之后添加i;线.
>由于您需要字符输出,因此在将数据写入cipherStream时,请将强制转换添加到char,即cipherStream<< (炭)值

转载注明原文:c将带有“:”的十六进制字符串转换为原始的“二进制”字符串 - 代码日志