从std :: string转换为DWORD

时间:2011-04-26 13:51:09

标签: c++ string winapi type-conversion dword


我对转换有一个简单的问题:

std::string str = "0xC0A80A02"

我需要将其转换为DWORD 我在网上搜索并找到了一些解决方案,但似乎都没有 try1:

DWORD m_dwIP = atol(str.c_str());

试试2:

std::istringstream ss(str.c_str());
ss >> m_dwIP;

尝试3:

sscanf (str.c_str(),"%u",str,&m_dwIP);

请注意,字符串将值存储为hexa。

谢谢,
加布里埃尔

3 个答案:

答案 0 :(得分:7)

假设sizeof(DWORD) == sizeof(unsigned long),应该这样做:

#include <cstdlib>
DWORD m_dwIP = std::strtoul(str.c_str(), NULL, 16);

请参阅http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/

请注意,这可用于C和C ++(std::c_str()的条带,并将<cstdlib>更改为<stdlib.h>,但这应该非常明显。)< / p>

答案 1 :(得分:5)

istringstream可以正常工作,只需删除0x前缀并使用std::hex格式化程序:

  std::string str = "0xC0A80A02";
  unsigned int m_dwIP;

  std::istringstream ss(&str[2]);
  ss >> std::hex >> m_dwIP;

  std::cout << std::hex << m_dwIP << "\n";

输出c0a80a02

答案 2 :(得分:-3)

这是一个相当简单的问题。作为一个人,你会如何读取十六进制数并将其转换为十进制数?如果你是超人,你会立即知道它,但如果你像我们其他人一样,并使用宝贵的大脑空间来记住非计算机的东西,比如如何摆动高尔夫球杆,你将不得不做一些算术。你使用心算法进行转换,你需要的是为你做思考的代码。您可以使用此算法:

  1. 将累加器变量初始化为0
  2. 将乘数变量初始化为1
  3. 从字符串的END循环,直到到达数字的开头(在您的情况下为'x'char)
  4. 对于每个char,取char的十六进制值(0-9为0-9,a-f为10-15)并乘以乘数,并将其添加到累加器
  5. 将累加器乘以16(或冷却,然后向左移4位)
  6. 重复回#3直到你完成所有数字
  7. 完成所有操作后,累加器中剩余的值就是结果。