3


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

std::string str = "0xC0A80A02"

我需要将其转换为 DWORD。
我在网上搜索并找到了一些解决方案,但似乎没有一个有效。
尝试1:

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 中。

谢谢,
加布里埃尔

4

3 回答 3

7

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

于 2011-04-26T13:57:01.593 回答
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::andc_str()和更改<cstdlib><stdlib.h>,但这应该很明显)。

于 2011-04-26T13:57:12.057 回答
-3

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

  1. 将累加器变量初始化为 0
  2. 将乘数变量初始化为 1
  3. 从字符串的 END 循环,直到到达数字的开头(在您的情况下为 'x' 字符)
  4. 对于每个字符,取字符的十六进制值(0-9 为 0-9,10-15 为 af)并乘以乘数,并将其添加到累加器
  5. 将你的累加器乘以 16(或者很酷,只需向左移动 4 位)
  6. 重复回到#3,直到完成所有数字

完成后,累加器中剩余的值就是您的结果。

于 2011-04-26T13:56:30.197 回答