преобразование 4-байтовой шестнадцатеричной строки в целое число

Я пытаюсь сделать преобразование из шестнадцатеричной строки в целое число в проекте MFC.
Код выглядит так:

CString sMask = "0xFFFFFFE0";
char* pMaskBuffer   = sMask.GetBuffer(sMask.GetLength());
sMask.ReleaseBuffer();
char * p = NULL;
long iMask = strtol(pMaskBuffer, &p, 16);

Код работал нормально, когда переменная sMask была маленькой. Но 4-байтовая маска генерирует странные значения. Вместо 4294967264 я получаю 2147483647. Как это преодолеть. Помогите, пожалуйста.

1

Решение

Это потому, что strtol возвращает долго использовать это

unsigned long iMask = strtoul(pMaskBuffer, &p, 16);
4

Другие решения

Также убедитесь, что вы ReleaseBuffer после использовать. Ваша программа имеет неопределенное поведение

Адрес, возвращаемый GetBuffer, недействителен после вызова ReleaseBuffer или любой другой операции CString.

http://msdn.microsoft.com/en-us/library/aa300574(v=vs.60).aspx

Как люди объяснили, вы хотите unsigned long разбор.

3

Из std::strtol справочная страница:

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

В твоем случае LONG_MAX возвращается, и если вы проверите errno Могу поспорить, что это будет ERANGE, Причина в том, что strtol для подписанный значения, если вы хотите беззнаковые значения, вы должны использовать std::strtoul.


Также обратите внимание, если вы когда-нибудь в будущем перейдете на использование функции C ++ 11 std::stol, это бросит std::out_of_range исключение в этом случае.

1
По вопросам рекламы [email protected]