Конвертировать из std :: string в DWORD - PullRequest
2 голосов
/ 26 апреля 2011


У меня есть простая проблема с преобразованием:

std::string str = "0xC0A80A02"

и мне нужно преобразовать его в DWORD.
Я искал в Интернете и нашел какое-то решение, но ни одно из них не работает.
попробуй 1:

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

try2:

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

try3:

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

Обратите внимание, что строка хранит значение в гекса.

Спасибо
Gabriel

Ответы [ 3 ]

7 голосов
/ 26 апреля 2011

Предполагая 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>, но это должно быть довольно очевидно).

5 голосов
/ 26 апреля 2011

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.

0 голосов
/ 26 апреля 2011

Это довольно простая проблема. Как бы вы, как человек, прочитали это шестнадцатеричное число и преобразовали его в десятичное? Если вы сверхчеловек, вы просто сразу узнаете об этом, но если вы похожи на нас и используете ценное пространство для мозга, чтобы запоминать некомпьютерные вещи, например, как качать клюшку для гольфа, вам придется заняться арифметикой. Вы бы использовали ментальный алгоритм для преобразования, и вам нужен код, который будет думать за вас. Вы можете использовать этот алгоритм:

  1. инициализировать переменную аккумулятора в 0
  2. инициализировать переменную множителя 1
  3. цикл с конца строки, пока вы не достигнете начала числа (символ 'x' в вашем случае)
  4. для каждого символа, возьмите шестнадцатеричное значение символа (0-9 для 0-9, 10-15 для a-f), умножьте его на множитель и добавьте к аккумулятору
  5. умножьте свой аккумулятор на 16 (или будьте крутым и просто сдвиньте влево 4 бита)
  6. повторять до # 3, пока вы не закончите все цифры

Когда вы все закончите, значение, оставленное в вашем аккумуляторе, будет вашим результатом.

...