Распечатка DWORD в шестнадцатеричном виде возвращает 0x7FFFFFFF в win32 c ++ - PullRequest
0 голосов
/ 14 января 2020

В настоящее время я работаю над приложением win32, которое использует sha1 ha sh для строк для генерации ключей для моей карты. Я хочу использовать ha sh как DWORD, поэтому я могу вычислить некоторые вычисления между хэшами.

Поскольку sha1 ha sh воспроизводит 160-битные значения ha sh, я создал структуру с 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 содержать большой размер, и это не составило проблемы (Связано: Какое наибольшее целое число 16, которое можно сохранить в переменной типа dword? )

Может кто-нибудь помочь? Заранее спасибо.

1 Ответ

2 голосов
/ 14 января 2020

Функция strtol возвращает длинное целое число со знаком, которое в windows имеет диапазон от -2 147 483 648 до 2 147 483 647 .

Если strtol обнаружит, что сгенерированное число равно вне диапазона, он возвратит максимальное длинное значение. От cppreference :

Если преобразованное значение выходит за пределы диапазона соответствующего типа возврата, возникает ошибка диапазона (установка errno на ERANGE) и LONG_MAX, LONG_MIN, LLONG_MAX или LLONG_MIN имеет значение возвращается.

Используйте взамен std::strtoul.

...