Я пытаюсь сделать преобразование из шестнадцатеричной строки в целое число в проекте 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. Как это преодолеть. Помогите, пожалуйста.
Это потому, что strtol возвращает долго использовать это
unsigned long iMask = strtoul(pMaskBuffer, &p, 16);
Также убедитесь, что вы ReleaseBuffer после использовать. Ваша программа имеет неопределенное поведение
Адрес, возвращаемый GetBuffer, недействителен после вызова ReleaseBuffer или любой другой операции CString.
http://msdn.microsoft.com/en-us/library/aa300574(v=vs.60).aspx
Как люди объяснили, вы хотите unsigned long
разбор.
Из std::strtol
справочная страница:
Если преобразованное значение выходит за пределы диапазона соответствующего типа возврата, возникает ошибка диапазона (настройка
errno
вERANGE
) а такжеLONG_MAX
,LONG_MIN
… возвращается.
В твоем случае LONG_MAX
возвращается, и если вы проверите errno
Могу поспорить, что это будет ERANGE
, Причина в том, что strtol
для подписанный значения, если вы хотите беззнаковые значения, вы должны использовать std::strtoul
.
Также обратите внимание, если вы когда-нибудь в будущем перейдете на использование функции C ++ 11 std::stol
, это бросит std::out_of_range
исключение в этом случае.