Целое число в шестнадцатеричную строку в C++
Как преобразовать целое число в шестнадцатеричную строку в C++?
Я могу найти некоторые способы сделать это, но они в основном кажутся нацеленными на C. похоже, что нет собственного способа сделать это в C++. Это довольно простая проблема, хотя; у меня есть int который я хочу преобразовать в шестнадцатеричную строку для последующей печати.
13 ответов:
использовать
<iomanip>' sstd::hex. Если вы печатаете, просто отправьте его наstd::cout, если нет, то используйтеstd::stringstreamstd::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();
вы можете попробовать следующие. Это работает...
#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; }
для тех из вас, кто понял, что многие/большинство
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");
ответ Корнеля Киселевича велик. Но небольшое добавление помогает поймать случаи, когда вы вызываете эту функцию с аргументами шаблона, которые не имеют смысла (например, 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