2

我正在尝试在 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。如何克服这个问题。请帮忙。

4

3 回答 3

5

那是因为 strtol 返回 long use this

unsigned long iMask = strtoul(pMaskBuffer, &p, 16);
于 2013-10-31T07:52:43.093 回答
3

还要确保在使用ReleaseBuffer 。你的程序有未定义的行为

GetBuffer 返回的地址在调用 ReleaseBuffer 或任何其他 CString 操作后无效。

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

正如人们所解释的那样,您需要unsigned long解析。

于 2013-10-31T07:53:08.090 回答
1

std::strtol参考页面

如果转换后的值超出相应返回类型的范围,则会发生范围错误(设置errnoERANGE)并返回LONG_MAX, LONG_MIN, ...。

在你的情况下LONG_MAX被退回,如果你检查errno我打赌它会是ERANGE. 原因是strtol符号值,如果你想要无符号值,你应该使用std::strtoul.


另请注意,如果您将来更改为使用 C++11 函数std::stol,在这种情况下它将引发std::out_of_range异常。

于 2013-10-31T07:50:52.717 回答