Использование std :: hex для преобразования шестнадцатеричного числа в десятичное - PullRequest
0 голосов
/ 25 июня 2018

Я работаю с VS 2010 на Windows.У меня есть функция, которая принимает указатель char.Теперь внутри функции я звоню std::hex, чтобы преобразовать ее в десятичную, но по какой-то причине она не работает.Он выводит большое значение, что заставляет меня думать, что вместо этого он конвертирует адрес.

void convertHexToDec(char* hex, char * dec)
{
    long long decimal;
    std::stringstream ss;

    ss << hex;
    ss >> std::hex >> decimal;

    sprintf (dec, "%llu", decimal);
}

Итак, если передача указателя char, содержащего "58", выходное десятичное значение будет выглядеть примерно так:1D34E78xxxxxxxxx.Похоже, что он конвертирует адрес гекса.

Я тоже пробовал эти способы:

ss << *hex;

ss << (char*)hex[0];

ss << (int *)&hex[0];

Ничего из вышеперечисленного не сработало.

Любая идея, как я могу сделатьэта функция работает?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Причиной вашей ошибки, вероятно, является неправильный printf спецификатор.Кроме того, sprintf является небезопасным : предполагается, что буфер назначения (dec) достаточно большой.

Возможное решение с использованием сигнатуры вашей функции - не рекомендуется, поскольку вы не знаетеразмер пункта назначения:

void convertHexToDec( char* hex, char * dec )
{
  std::sprintf( dec, "%lld", std::strtoll( hex, 0, 16 ) );
}

Безопасное решение:

std::string convertHexToDec( const char* h )
{
  return std::to_string( std::strtoll( h, 0, 16 ) );
}

Безопасное решение с использованием потоков:

std::string convertHexToDec( const char* h )
{
  long long lld;
  std::istringstream( h ) >> std::hex >> lld;

  std::ostringstream os;
  os << lld;

  return os.str();
}
0 голосов
/ 25 июня 2018

Кроме того, что вы не используете std::string и ссылки, я попробовал следующий код:

#include <iostream>
#include <sstream>

void convertHexToDec(char* hex, char* dec)
{
    long long decimal;
    std::stringstream ss;

    ss << hex;
    ss >> std::hex >> decimal;
    std::cout << "Decimal: " << decimal << "\n";

    sprintf (dec, "%llu", decimal);
}

int main()
{
    char hex[] = "58";
    char dec[4];

    convertHexToDec(hex, dec);

    std::cout << "Output string: " << dec << "\n";
}

Вывод:

Decimal: 88
Output string: 88

живой пример

Так в чем твоя проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...