Целое число в шестнадцатеричную строку в C++



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



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

1170   13  

13 ответов:

использовать <iomanip> ' s std::hex. Если вы печатаете, просто отправьте его на std::cout, если нет, то используйте std::stringstream

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );

вы можете добавить первое << С << "0x" или все, что вам нравится, если вы хотите.

другие manips интереса std::oct (восьмеричная) и std::dec (вернуться к десятичной системе счисления).

одна из проблем, с которой вы можете столкнуться, заключается в том, что это создает точное количество цифр, необходимых для его представления. Вы можете использовать setfill и setw это чтобы обойти проблему:

stream << std::setfill ('0') << std::setw(sizeof(your_type)*2) 
       << std::hex << your_int;

Итак, наконец, я бы предложил такую функцию:

template< typename T >
std::string int_to_hex( T i )
{
  std::stringstream stream;
  stream << "0x" 
         << std::setfill ('0') << std::setw(sizeof(T)*2) 
         << std::hex << i;
  return stream.str();
}

чтобы сделать его легче и быстрее я предлагаю использовать прямое заполнение строки.

template <typename I> std::string n2hexstr(I w, size_t hex_len = sizeof(I)<<1) {
    static const char* digits = "0123456789ABCDEF";
    std::string rc(hex_len,'0');
    for (size_t i=0, j=(hex_len-1)*4 ; i<hex_len; ++i,j-=4)
        rc[i] = digits[(w>>j) & 0x0f];
    return rc;
}

использовать std::stringstream для преобразования целых чисел в строки и специальные манипуляторы для установки базового. Например вот так:

std::stringstream sstream;
sstream << std::hex << my_integer;
std::string result = sstream.str();

просто выведите его в виде шестнадцатеричного числа:

int i = /* ... */;
std::cout << std::hex << i;

вы можете попробовать следующие. Это работает...

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
string to_string(T t, ios_base & (*f)(ios_base&))
{
  ostringstream oss;
  oss << f << t;
  return oss.str();
}

int main ()
{
  cout<<to_string<long>(123456, hex)<<endl;
  system("PAUSE");
  return 0;
}
int num = 30;
std::cout << std::hex << num << endl; // This should give you hexa- decimal of 30

для тех из вас, кто понял, что многие/большинство 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);

код для вашей ссылки:

#include <iomanip>
...
string intToHexString(int intValue) {

    string hexStr;

    /// integer value to hex-string
    std::stringstream sstream;
    sstream << "0x"
            << std::setfill ('0') << std::setw(2)
    << std::hex << (int)intValue;

    hexStr= sstream.str();
    sstream.clear();    //clears out the stream-string

    return hexStr;
}

этот вопрос старый, но я удивлен, почему никто не упомянул boost::format:

cout << (boost::format("%x") % 1234).str();  // output is: 4d2

просто взгляните на мое решение,[1] что я дословно скопировал из моего проекта, так что там немецкий API doc включен. Моя цель состояла в том, чтобы объединить гибкость и безопасность в рамках моих реальных потребностей:[2]

  • нет 0x префикс добавлено: звонящий может решить
  • автоматическая ширина вычет: меньше набирать
  • явный ширина контроль: расширение для форматирования (без потерь) сокращение для экономии места
  • способно для борьбы с long long
  • ограничен интегральные типы: избегайте сюрпризов с помощью бесшумных преобразований
  • простоты понимания
  • нет жесткого ограничения
#include <string>
#include <sstream>
#include <iomanip>

/// Vertextet einen Ganzzahlwert val im Hexadezimalformat.
/// Auf die Minimal-Breite width wird mit führenden Nullen aufgefüllt;
/// falls nicht angegeben, wird diese Breite aus dem Typ des Arguments
/// abgeleitet. Funktion geeignet von char bis long long.
/// Zeiger, Fließkommazahlen u.ä. werden nicht unterstützt, ihre
/// Übergabe führt zu einem (beabsichtigten!) Compilerfehler.
/// Grundlagen aus: http://stackoverflow.com/a/5100745/2932052
template <typename T>
inline std::string int_to_hex(T val, size_t width=sizeof(T)*2)
{
    std::stringstream ss;
    ss << std::setfill('0') << std::setw(width) << std::hex << (val|0);
    return ss.str();
}

[1] на основе ответа от Корнель Kisielewicz
[2] переводится на язык CppTest этот вот как это читается:

TEST_ASSERT(int_to_hex(char(0x12)) == "12");
TEST_ASSERT(int_to_hex(short(0x1234)) == "1234");
TEST_ASSERT(int_to_hex(long(0x12345678)) == "12345678");
TEST_ASSERT(int_to_hex((long long)(0x123456789abcdef0)) == "123456789abcdef0");
TEST_ASSERT(int_to_hex(0x123, 1) == "123");
TEST_ASSERT(int_to_hex(0x123, 8) == "00000123");

Я:

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

посмотри так ответ от iFreilicht и требуемый заголовок шаблона-файл отсюда суть!

ответ Корнеля Киселевича велик. Но небольшое добавление помогает поймать случаи, когда вы вызываете эту функцию с аргументами шаблона, которые не имеют смысла (например, float) или которые приведут к беспорядочным ошибкам компилятора (например, определяемый пользователем тип).

template< typename T >
std::string int_to_hex( T i )
{
  // Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher.
  static_assert(std::is_integral<T>::value, "Template argument 'T' must be a fundamental integer type (e.g. int, short, etc..).");

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

         // Optional: replace above line with this to handle 8-bit integers.
         // << std::hex << std::to_string(i);

  return stream.str();
}

я отредактировал это, чтобы добавить вызов std:: to_string, потому что 8-разрядные целочисленные типы (например,std::uint8_t значение) с std::stringstream рассматриваются как символ, который не дает вам желаемого результата. Передавая такие целые числа в std::to_string обрабатывает их правильно и не повреждает вещи при использовании других, больших целочисленных типов. Конечно, вы можете пострадать от небольшого снижения производительности в этих случаях, так как вызов std::to_string не нужен.

примечание: Я бы просто добавил Это в комментарии к исходному ответу, но у меня нет репутации для комментариев.

попробуйте это:

#include<iostream>

using namespace std;

int main() {
    int *a = new int;//or put a number exept new int
                     //use * for pointer
    cin >> *a;
    cout << a; //if integer that is made as pointer printed without *, than it will print hex value
    return 0;
    //I hope i help you
}

Comments

    Ничего не найдено.