c++ - 旧编译器的基于范围的循环到旧样式

标签 c++ loops md5 ranged-loops

最近我在尝试使用此代码从字符串生成 MD5。

string SecureInfrastructure::Generate_MD5_FromString(const string &data)
{
    unsigned char result[MD5_DIGEST_LENGTH];
    MD5((unsigned char*)data.c_str(), data.size(), result);

    std::ostringstream sout;
    sout<<std::hex<<std::setfill('0');
    for(long long c: result)
    {
        sout<<std::setw(2)<<(long long)c;
    }
    return sout.str();
}

但是,我使用的编译器不支持基于范围的 for 循环,我尝试将此代码转换为传统的 for(...;...;...) 循环使用下面的代码。

string SecureInfrastructure::Generate_MD5_FromString(const string &data)
{
    unsigned char result[MD5_DIGEST_LENGTH];
    MD5((unsigned char*)data.c_str(), data.size(), result);

    std::ostringstream sout;
    sout<<std::hex<<std::setfill('0');
    for(long long c; c<sizeof(result); c++) // long long c: result
    {
        sout<<std::setw(2)<<(long long)c;
    }
    return sout.str();
}

当我测试它不起作用时,因为我得到一个空字符串。我很难找到错误所在。我应该如何用传统的 for 循环重新实现第一段代码?

最佳答案

当你有

for(long long c: result)
{
    sout<<std::setw(2)<<(long long)c;
}

for(long long c: result) 说:对于 result 中的每个元素,将其分配给名为 long long 类型的变量c。然后循环体使用 c。要在常规 for 循环中获得相同的行为,您需要做相同的事情。告诉编译器循环遍历你需要的所有元素

for(size_t i = 0; i < MD5_DIGEST_LENGTH; i++)

您可以直接在循环中使用该元素,而不是创建变量。看起来像

sout<<std::setw(2)<<(long long)result[index_of_element];

将它们组合在一起你会得到

for(size_t i = 0; i < MD5_DIGEST_LENGTH; i++)
{
    sout<<std::setw(2)<<(long long)result[i];
}

关于c++ - 旧编译器的基于范围的循环到旧样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58597352/

相关文章:

php - 加密密码列表

networking - MD5 目的或用途

c++ - Qt - MDI Child 未正确关闭

mysql - 设置存储参数时出现问题

java - 静态ArrayList - 填充增强循环

c++ - 使用 C++ 元组类型作为映射中的键

java - 随机salt md5实现,包括新注册/更改密码

c++ - 如何在 C++ 中注册动态成员

C++双向链表 - 使用pop_back()从尾部删除元素

c++ - LuaPlus:如何从多线程 C++ 调用 Lua 函数?