C++ 在win32 c+中以十六进制打印DWORD将返回0x7FFFFFFF+;

C++ 在win32 c+中以十六进制打印DWORD将返回0x7FFFFFFF+;,c++,winapi,dword,C++,Winapi,Dword,我目前正在开发win32应用程序,该应用程序使用字符串上的sha1哈希为我的映射生成密钥。我想使用哈希作为DWORD,这样我可以在哈希之间计算一些计算 由于sha1散列复制160位散列值,因此我创建了一个具有5DWORD(32位*5=160)的结构 我已经散列了字符串并存储到结构中 void GenerateNodeKey() { // SHA-1 Hashing Process // ex) strHash = 356A192B7913B04C54574D18C28D46E63

我目前正在开发win32应用程序,该应用程序使用字符串上的sha1哈希为我的映射生成密钥。我想使用哈希作为DWORD,这样我可以在哈希之间计算一些计算

由于sha1散列复制160位散列值,因此我创建了一个具有5
DWORD
(32位*5=160)的结构

我已经散列了字符串并存储到结构中

void GenerateNodeKey()
{
    // SHA-1 Hashing Process
    // ex) strHash = 356A192B7913B04C54574D18C28D46E6395428AB    

    SHA1_HASH key;
    string s_prefix = "0x";
    key.dwFirst = strtol((s_prefix+strHash.substr(0,8)).c_str(), 0, 0); // first 8 bytes
    ...
    ...
    key.dwFifth = strtol((s_prefix+strHash.substr(32,8)).c_str(), 0, 0); // last 8 bytes
}
但当我试图打印值以检查它们是否正常时,问题出现了

    wcout << hex 
          << "Node ID : " << key.dwFirst << key.dwSecond << key.dwThird << key.dwFourth << key.dwFifth 
          << dec
          << endl;

wcoutstrtol
函数返回一个有符号长整数,该整数在windows上的范围为

如果
strtol
检测到生成的数字超出范围,它将返回最大长值。发件人:

如果转换后的值超出相应的返回范围 类型,则出现范围错误(将errno设置为ERANGE)和LONG_MAX, 返回LONG_MIN、LLONG_MAX或LLONG_MIN


改用
std::strtoul
strtol
函数返回一个有符号长整数,在windows上的范围为

如果
strtol
检测到生成的数字超出范围,它将返回最大长值。发件人:

如果转换后的值超出相应的返回范围 类型,则出现范围错误(将errno设置为ERANGE)和LONG_MAX, 返回LONG_MIN、LLONG_MAX或LLONG_MIN


改为使用std::strtoul

那么…转换成一个无符号整数,它具有字符串的全部正范围?(不管你为什么要得到一个字符串值的散列,它必须已经从整数转换过来了…
key.dwFirst=std::stoul(strHash.substr(0,8),nullptr,16)。您可以使用stoul或strtoul的基参数,而不是在0xSo…之前加上前缀。转换为无符号整数,该整数具有字符串的完整正范围?(不管你为什么要得到一个字符串值的散列,它必须已经从整数转换过来了…
key.dwFirst=std::stoul(strHash.substr(0,8),nullptr,16)。您可以使用stoul或strtoul的基本参数,而不是在0xWow前面加上前缀。谢谢太快了。关于我可以用来将字符串转换为DWORD的函数的任何建议?Nevermind,我使用
istringsteam
来解决这个问题。谢谢你的帮助。谢谢太快了。关于我可以用来将字符串转换为DWORD的函数的任何建议?Nevermind,我使用
istringsteam
来解决这个问题。谢谢你的帮助。
    wcout << hex 
          << "Node ID : " << key.dwFirst << key.dwSecond << key.dwThird << key.dwFourth << key.dwFifth 
          << dec
          << endl;