2011-04-26 1 views
1


У меня есть простая проблема с конверсией:Преобразовать из станда :: строки в DWORD

std::string str = "0xC0A80A02" 

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

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

+0

Я отметил это как windows-api, потому что он специфичен для Windows ('DWORD' не является стандартным C++) – alternative

+0

@mathepic спасибо Я начинаю с C++, и я получаю все типы смешаны – Gabriel

+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.

+0

Или вы можете сделать то, что говорит этот ответ, и сделать это быстрее. – NVade

+0

DWORD без знака long, а не int. –

+2

@ Draco: 'DWORD -' DWORD. Объявление этого как такового спасет вас от неожиданностей. –

-3

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

  1. инициализировать переменный аккумулятор до 0
  2. инициализировать переменный множитель 1
  3. петли от конца строки, пока не дойдете до начала числа («х» char в вашем случае)
  4. для каждого символа, возьмите шестнадцатеричное значение char (0-9 для 0-9, 10-15 для af) и умножьте его на множитель и добавьте его в аккумулятор
  5. умножьте свой аккумулятор на 16 (или будьте крутыми и просто сдвиньтесь влево на 4 бита)
  6. повторите возврат к № 3 до тех пор, пока вы не закончите все цифры

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

+3

-1, не изобретать велосипед – orlp

+0

-1: Этот код не нужно писать, поскольку стандартная библиотека обеспечивает Это. Мне жаль, что я не смогу повторить второй раз за снисходительный тон. –

+0

На самом деле, я не собирался снисходить с этим, я пытался быть чрезмерно случайным. Однако хороший вызов стандартной реализации. – NVade

6

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

+0

Я тоже тестировал эту реализацию, и она тоже работает. Мне жаль, что я не могу выбрать оба ответа. – Gabriel

 Смежные вопросы

  • Нет связанных вопросов^_^