У меня есть проблема, когда я пытаюсь преобразовать числа в шестнадцатеричные с помощью следующего кода.
int numconvert(string hexnum)
{
stringstream converter(hexnum);
unsigned int value = 0;
converter >> hex >> value;
return value;
}
string hexconvert(int hexnum)
{
stringstream ss;
ss << hex << hexnum;
string n;
ss >> n;
return n;
}
Я использую numconvert, чтобы изменить ввод с строки на int, затем я использую hexconvert, чтобы изменить это в hex и сохранить его как строку.
Кажется, что все работает просто отлично, но почему-то, когда я передаю его 4096, он возвращает мне 4096. Я ожидал 1000, но я не уверен, почему это из-за меня. Я даю ему 4096, и я замечаю, что он возвращает int 16534, затем программа отправляет его в hexconvert и возвращает 4096, что технически правильно, но не то, что я хотел.
Кажется, он отлично справляется с другими числами. Что я здесь не так делаю?
Я думаю, что у вас есть логическая ошибка там. Если вы напишите:
int n = numconvert("4096");
std::string s = hexconvert(n);
Вы в основном говорите, что интерпретировать «4096» уже как шестнадцатеричное число, потому что вы получили converter >> hex >> value;
внутри numconvert
перевод его обратно в hex всегда приведет к тому же возвращению.
То, что вы хотите, это, вероятно,
int n = std::stoi("4096");
std::string s = hexconvert(n);
Это будет интерпретировать «4096» как обычное число 10, а затем снова преобразовать его в шестнадцатеричную строку, используя ваш hexconvert
,
Это сказал ваш numconvert
может быть написан короче и, возможно, немного более эффективно, используя СТД :: стои тоже в основном просто:
int numconvert(const std::string& str)
{
return std::stoi(str, nullptr, 16);
}
нам не нужен второй аргумент, поэтому мы передаем nullptr
3-й аргумент является основанием.
Попробуйте использовать str
член вместо оператора извлечения, чтобы извлечь строку из потока строк. Помимо того, что вы более прямолинейны, вам не нужно беспокоиться о том, как экстрактор будет дальше интерпретировать вещи.