2011-01-26 4 views
6

Возможного дубликата:
C++ convert hex string to signed integerC++ шестнадцатеричной строки для неподписанного Int

Я пытаюсь преобразовать шестнадцатеричную строку без знака междунара в C++. Мой код выглядит так:

string hex("FFFF0000"); 
UINT decimalValue; 
sscanf(hex.c_str(), "%x", &decimalValue); 
printf("\nstring=%s, decimalValue=%d",hex.c_str(),decimalValue); 

Результат - -65536. Я обычно не делаю слишком много программирования на С ++, поэтому любая помощь будет оценена по достоинству.

спасибо, Джефф

+0

Также см. [Преобразование шестнадцатеричной строки с ведущим «0x» в короткий короткий код на C++?] (Http://stackoverflow.com/q/1487440/608639) – jww

ответ

6

выхода с междунарами с %u вместо %d

+0

спасибо. работал отлично. –

+0

принят. извините, мне пришлось подождать несколько минут, прежде чем я смогу согласиться. –

18

Вы можете сделать это с помощью istringstream и hex манипулятора:

#include <sstream> 
#include <iomanip> 

std::istringstream converter("FFFF0000"); 
unsigned int value; 
converter >> std::hex >> value; 

Вы также можете использовать std::oct манипулятором для разбора восьмеричных значений.

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

std::cout << value << std::endl; // Knows 'value' is unsigned. 
+0

Кто-нибудь знает, что произойдет здесь, если число недействительно hex ? Я просто пробовал такие письма, как 0xG, и я не заметил исключения? – gbmhunter

+0

@gbmhunter Это приведет к тому, что поток войдет в состояние сбоя, что не обязательно вызовет исключение, если вы не включили их. Возможно, вы захотите прочитать «failbit» и сбои потока. – templatetypedef

3

%d интерпретирует биты UINT как знаковые , Вам нужно:

printf("\nstring=%s, decimalValue=%u",hex.c_str(),decimalValue); 
3

Ответ прав, 0xffff0000 является -65536, если интерпретируется как знаковое (% D PRINTF форматировщик). Вы хотите, чтобы ваш шестнадцатеричный номер интерпретировался как unsigned (% u или% x).

4

Ну, -65536 - 0xFFFF0000. Если вы будете использовать

printf("\nstring=%s, decimalValue=%u",hex.c_str(),decimalValue); 

он напечатает то, что вы ожидаете.

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