c++ - 以十六进制打印出 DWORD 在 win32 c++ 中返回 0x7FFFFFFF

标签 c++ winapi dword

我目前正在开发 win32 应用程序,该应用程序在字符串上使用 sha1 哈希来为我的 map 生成键。我想将散列用作 DWORD,因此我可以计算散列之间的一些计算。

由于 sha1 哈希重现 160 位哈希值,我创建了一个包含 5 个 DWORD(32 位 * 5 = 160)的结构。

struct _SHA1_HASH
{
   DWORD dwFirst;
   DWORD dwSecond;
   DWORD dwThird;
   DWORD dwFourth;
   DWORD dwFifth;
}SHA1_HASH;

我已经对字符串进行哈希处理并存储到结构中。

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;

如果 8 字节的十六进制值小于 7FFFFFFF (2,147,483,647),则打印没有问题。但是,当它大于该值时,它只打印出最大数量。我在网上搜索过 DWORD 能容纳多大,没问题(相关:What is the largest integer number base 16 that can be store in a variable of type dword?)

有人可以帮忙吗? 提前致谢。

最佳答案

strtol 函数返回一个带符号的长整数,在 Windows 上它的范围是 -2,147,483,648 to 2,147,483,647 .

如果strtol 检测到生成的数字超出范围,它将返回最大的long 值。来自 cppreference :

If the converted value falls out of range of corresponding return type, a range error occurs (setting errno to ERANGE) and LONG_MAX, LONG_MIN, LLONG_MAX or LLONG_MIN is returned.

改用std::strtoul

关于c++ - 以十六进制打印出 DWORD 在 win32 c++ 中返回 0x7FFFFFFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59726151/

相关文章:

c++ - 使用 `std::min` 作为算法参数

c++ - 当我尝试将 char* 分成标记时出现段错误

c++ - 为什么在将字符串类型转换为 DWORD 时在运行时得到不同的值?

c++ - 将 DWORD 写入内存只会覆盖 1 个字节而不是 4 个字节

c++ - 何时实例化模板非静态数据成员初始化程序?

c++ - 将指向同一类的私有(private)成员指针设置为 NULL?

c++ - BitBlt 内存泄漏

c++ - 无法更改背景颜色 MDI c++

c++ - 带有文件信息的 CaptureStackBackTrace

c++ - 没有从 DWORD 到 const char* 的转换