将4byte十六进制字符串转换为整数

时间:2013-10-31 07:48:27

标签: c++ mfc hex strtol

我正在尝试在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.如何克服这一点。请帮助。

3 个答案:

答案 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)

来自std::strtol reference page

  

如果转换后的值超出相应的返回类型范围,则会出现范围错误(将errno设置为ERANGE)和LONG_MAXLONG_MIN,...退回。

在您的情况下,LONG_MAX会被退回,如果您选中errno,我会打赌它会是ERANGE。原因是strtol用于签名值,如果您想要无符号值,则应使用std::strtoul


另请注意,如果您将来某个时候更改为使用C ++ 11函数std::stol,则在这种情况下会抛出std::out_of_range异常。