Целое число в шестнадцатеричную строку в C ++ - PullRequest
104 голосов
/ 24 февраля 2011

Как мне преобразовать целое число в шестнадцатеричную строку в C ++ ?

Я могу найти несколько способов сделать это, но они в основном нацелены на C.есть родной способ сделать это в C ++.Это довольно простая проблема;У меня есть int, который я хочу преобразовать в шестнадцатеричную строку для последующей печати.

Ответы [ 15 ]

2 голосов
/ 04 ноября 2014

Для тех из вас, кто понял, что многие / большая часть ios::fmtflags не работают с std::stringstream, все же нравится идея шаблона, которую Корнел опубликовал еще тогда, когда следующее работает и относительно чисто:

#include <iomanip>
#include <sstream>


template< typename T >
std::string hexify(T i)
{
    std::stringbuf buf;
    std::ostream os(&buf);


    os << "0x" << std::setfill('0') << std::setw(sizeof(T) * 2)
       << std::hex << i;

    return buf.str().c_str();
}


int someNumber = 314159265;
std::string hexified = hexify< int >(someNumber);
1 голос
/ 07 марта 2019

Мое решение.Разрешены только целочисленные типы.

Обновление. Вы можете установить дополнительный префикс 0x во втором параметре.

definition.h

#include  <iomanip>
#include <sstream>

template <class T, class T2 = typename std::enable_if<std::is_integral<T>::value>::type>
static std::string ToHex(const T & data, bool addPrefix = true);



template<class T, class>
inline std::string Convert::ToHex(const T & data, bool addPrefix)
{
    std::stringstream sstream;
    sstream << std::hex;
    std::string ret;
    if (typeid(T) == typeid(char) || typeid(T) == typeid(unsigned char) || sizeof(T)==1)
    {
        sstream << static_cast<int>(data);
        ret = sstream.str();
        if (ret.length() > 2)
        {
            ret = ret.substr(ret.length() - 2, 2);
        }
    }
    else
    {
        sstream << data;
        ret = sstream.str();
    }
    return (addPrefix ? u8"0x" : u8"") + ret;
}

main.cpp

#include <definition.h>
int main()
{
    std::cout << ToHex<unsigned char>(254) << std::endl;
    std::cout << ToHex<char>(-2) << std::endl;
    std::cout << ToHex<int>(-2) << std::endl;
    std::cout << ToHex<long long>(-2) << std::endl;

    std::cout<< std::endl;
    std::cout << ToHex<unsigned char>(254, false) << std::endl;
    std::cout << ToHex<char>(-2, false) << std::endl;
    std::cout << ToHex<int>(-2, false) << std::endl;
    std::cout << ToHex<long long>(-2, false) << std::endl;
    return 0;
}

Результаты:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe

fe
fe fffffffe
fffffffffffffffe

1 голос
/ 05 февраля 2018

Я делаю:

int hex = 10;      
std::string hexstring = stringFormat("%X", hex);  

Взгляните на SO ответ от iFreilicht и требуемый заголовочный файл шаблона отсюда GIST !

0 голосов
/ 22 декабря 2018
int var = 20;
cout <<                          &var << endl;
cout <<                     (int)&var << endl;
cout << std::hex << "0x" << (int)&var << endl << std::dec; // output in hex, reset back to dec

0x69fec4 (адрес)
6946500 (адрес до декабря)
0x69fec4 (адрес в декабрь, вывод в шестнадцатеричном формате)


инстинктивно пошел с этим ...
int address = (int) & var;

видел это в другом месте ...
длинный адрес без знака = reinterpret_cast (& var);

комментарий сказал мне, что это правильно ...
int address = (int) & var;

Говоря о хорошо покрытых легкость, ты где? они получают слишком много лайков!

0 голосов
/ 12 декабря 2018

`

char sw(int num){
   char h[16] = {'0','1','2','3','4','5','6','7','8','9','a','b',' c','d','e','f'};
   return h[num];
}

String to_hexa(int num) {
  int i, j, exp = 0, temp = num;
  String hexa;
  String begin;


  while( temp >= 16 ){
    exp++;
    temp /= 16;
  }

  for ( i = 0; i <= exp; ++i){
    temp = num;
    for ( j = i; j <= exp; ++j){
      if ( j == exp ) hexa += String(sw(temp % 16));
      else temp /= 16;
    }
  }
  begin = "0x";
  for (int i=0; i < 3 - exp; i++){
    begin += "0";
  }  
  return begin + hexa;
}

`

...