Целое число в шестнадцатеричную строку в C++
Как преобразовать целое число в шестнадцатеричную строку в C++?
Я могу найти некоторые способы сделать это, но они в основном нацелены на C. похоже, что нет собственного способа сделать это на C++. Это довольно простая проблема, хотя; у меня есть int
который я хочу преобразовать в шестнадцатеричную строку для последующей печати.
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();
вы можете попробовать следующие. Это работает...
#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
префикс добавлено: абонент может решить - автоматическая ширина вычет: меньше набирать
- явный ширина control: расширение для форматирования, (без потерь) сокращение, чтобы сэкономить место
- способно для борьбы с
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
рассматриваются как char, что не дает вам желаемого результата. Передача таких целых чисел в 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
}