我正在尝试在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.如何克服这一点。请帮助。
答案 0 :(得分:4)
那是因为strtol长期使用这个
unsigned long iMask = strtoul(pMaskBuffer, &p, 16);
答案 1 :(得分:3)
还要确保在之后使用ReleaseBuffer 。您的程序具有未定义的行为
调用ReleaseBuffer或任何其他CString操作后,GetBuffer返回的地址无效。
http://msdn.microsoft.com/en-us/library/aa300574(v=vs.60).aspx
正如人们所解释的那样,你需要unsigned long
解析。
答案 2 :(得分:1)
如果转换后的值超出相应的返回类型范围,则会出现范围错误(将
errno
设置为ERANGE
)和LONG_MAX
,LONG_MIN
,...退回。
在您的情况下,LONG_MAX
会被退回,如果您选中errno
,我会打赌它会是ERANGE
。原因是strtol
用于签名值,如果您想要无符号值,则应使用std::strtoul
。
另请注意,如果您将来某个时候更改为使用C ++ 11函数std::stol
,则在这种情况下会抛出std::out_of_range
异常。