gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:28 27 4
gpt4 key购买 nike

我目前正在开发 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com